web-dev-qa-db-ja.com

コアファイルの表示方法(一般)

シナリオ(Ubuntu 16.04):

Cプログラムをコンパイルして実行します(_-g_を使用して、従来のSegmentation Fault (core dumped)を取得します)。その後、(もちろん)神秘的な「コア」ファイルが見つかりません。 _/proc/sys/kernel/core_pattern_コマンドを使用して_echo '|tee /home/me/my_core_folder/my_core_file' | Sudo tee /proc/sys/kernel/core_pattern_を実行し、これを実行した後、_(core dumped)_の取得を停止し、単純な_Segmentation Fault_のみの取得を開始します。_gdb ./program_object_file.out core.pid_これは明らかに存在しません(私は絶望的になりました)。もちろん、単純な_gdb ./a.out_に続いて_(gdb) core core.pid_およびtabキーをスパムするコマンドのバリアントを試してください必死にオートコンプリートを取得して、必要な場所に移動しようとしています。

質問:

コアダンプにアクセスするための一般的な方法はありますか?私が触れるすべてのマシンには、ハードウェアとソフトウェアを再構成するMichael Bay's Transformers-esque機能があり、私が所有しているデバイスが通常の状態で正常に動作することを期待できないようであることを認識しています。自分のマシンと他の人のマシンでコアダンプを見つけるために使用できる単純なアルゴリズム/レシピはありますか?私は常に自分自身のために何かを機能させるための少しの作業の後、このようなもので友人を個別指導していることに気づきます、そして実行可能ファイルが実行されたディレクトリにコアファイルをダンプするためにコマンドまたは何かを実行することができればいいでしょう...これを実行する方法はありますか?ほとんどの(私は "一部の"で解決します)Linux/Unixマシンで動作しますか?

4
botch

core(5) マンページには、コアダンプに影響を与えるパラメーターの詳細(名前など)が記載されています。

あなたが述べた質問に答えるために、コアダンプを見つける一般的な方法はありません。デフォルトでは、コアがprocessの現在の作業ディレクトリにダンプされます(プロセスがそこに書き込むことが許可されている場合、ファイルシステムに十分なスペースがある場合) 、既存のコアダンプがない場合(状況によって)、ファイルサイズとコアファイルサイズの制限(ulimitまたは同様のメカニズムによって設定される)で許可されている場合。ただし、/proc/sys/kernel/core_patternはコアダンプを処理するさまざまな方法を提供するため、実際にそれを見て何が起こっているのかを理解する必要があります。

あなたの場合、コアが最初に見つからなかった理由はわかりませんが、リダイレクトを設定した後でコアの取得を停止した理由はわかります。処理プログラムcore_patternでパイプを使用すると絶対パス名を使用して指定する必要がありますtee自体は使用されません。 /usr/bin/teeを指定する必要があります。コアダンプを処理するために実行されるプログラムはrootとして実行されるため、マルチユーザーシステムではこのタイプのセットアップに特に注意する必要があることに注意してください。

Debianの派生物に私は corekeeper をインストールします。これにより、/var/crashの下のユーザーごとのディレクトリに簡単に使用できる方法でコアダンプが書き込まれます。

4
Stephen Kitt

(質問のOPから回答への回答の移動)

以下の答えを正解としてマークしました。これは実際に何が問題になっているのかを特定するのに役立ちました。将来的にこれを具体化するために戻りたいのですが、現在の解決策(ほとんどの場合はうまくいくと思われます) Linuxマシン)は、次のコマンドを使用します-

cat /proc/sys/kernel/core_pattern > ~/.core_pattern.bak 
echo '|/usr/bin/tee ~/path_you_wish_to_dump_to/core/dump' | Sudo tee /proc/sys/kernel/core_pattern

これにより、以前のコアダンプ方法が隠しファイル(.core_pattern.bak)で復元できるホームフォルダ内

Sudo cp ~/.core_pattern.bak /proc/sys/kernel/core_pattern

2番目のコマンドは、コアダンプをcoreという名前のフォルダーに、dumpという名前のファイルとしてダンプします。明らかに、このフォーマットをいじくり回して、好みに合わせてパターンを取得できます。ただし、私が知る限り、これは一度に1つのコアダンプのみを格納します(新しいものはそれぞれ古いものを破壊します)。ただし、個人的にコアダンプを確認した場合、それは実行したばかりのプログラム。古いダンプを保持する必要がないので、これは私にとっては良い解決策であり、ほとんどのアプリケーションでは、友人が作成してデバッグすることになります。私はこの回答を少し先に修正して、segfaultを引き起こしたPIDなどを含めたいと思います(ほとんどの場合、砂糖が上にあります-もう一度-私は通常、実行したので、どのプログラムがsegfaultを引き起こしたかを知っています)。私と私が想像する多くの人々にとって確かに十分です。

最後に重要なことですが、実際にダンプを表示するには、次のコマンドを実行します。

gdb ./executable_that_crashed ~/path_you_wish_to_dump_to/core/dump

Segfaultを取得している実行可能ファイルをコンパイル/実行したフォルダーにいるとします。

0
Jeff Schaller