シナリオ(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マシンで動作しますか?
core(5)
マンページには、コアダンプに影響を与えるパラメーターの詳細(名前など)が記載されています。
あなたが述べた質問に答えるために、コアダンプを見つける一般的な方法はありません。デフォルトでは、コアがprocessの現在の作業ディレクトリにダンプされます(プロセスがそこに書き込むことが許可されている場合、ファイルシステムに十分なスペースがある場合) 、既存のコアダンプがない場合(状況によって)、ファイルサイズとコアファイルサイズの制限(ulimit
または同様のメカニズムによって設定される)で許可されている場合。ただし、/proc/sys/kernel/core_pattern
はコアダンプを処理するさまざまな方法を提供するため、実際にそれを見て何が起こっているのかを理解する必要があります。
あなたの場合、コアが最初に見つからなかった理由はわかりませんが、リダイレクトを設定した後でコアの取得を停止した理由はわかります。処理プログラムcore_pattern
でパイプを使用すると絶対パス名を使用して指定する必要があります。 tee
自体は使用されません。 /usr/bin/tee
を指定する必要があります。コアダンプを処理するために実行されるプログラムはroot
として実行されるため、マルチユーザーシステムではこのタイプのセットアップに特に注意する必要があることに注意してください。
Debianの派生物に私は corekeeper
をインストールします。これにより、/var/crash
の下のユーザーごとのディレクトリに簡単に使用できる方法でコアダンプが書き込まれます。
(質問の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を取得している実行可能ファイルをコンパイル/実行したフォルダーにいるとします。