シナリオ(Ubuntu 16.04):
Cプログラムをコンパイルして実行します(を使用して-g
Traditionalを取得し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
質問:
コアダンプを取得する一般的な方法はありますか?私は私が接触したすべてのマシンに次の特徴があることに気づきました。マイケル・ベイの変圧器-esque私が所有するすべてのデバイスがデフォルトで正しく機能しないようにハードウェアとソフトウェアを再構成する機能です。私のコンピュータはもちろん、他のコンピュータでもコアダンプを見つけることができる簡単なアルゴリズム/方法はありますか?私はいつも自分のために仕事をたくさんした後、友人にこのようなことを教えることを発見します。コマンドや何かを実行して、実行可能ファイルが実行されているディレクトリにコアファイルをダンプできるようにしたいと思います。わかりました。
答え1
これcore(5)
マンページでは、命名を含むコアダンプに影響を与えるパラメータについて詳しく説明します。
あなたの質問に答えると、コアダンプを見つけるための普遍的な方法はありません。デフォルトでは、コアダンプはプロセス現在の作業ディレクトリ、プロセスがそこに書き込むことができる場合、含むファイルシステムに十分なスペースがある場合、既存のコアダンプがない場合(場合によっては)、ファイルサイズとコアファイルサイズの制限(次に決定)ulimit
などメカニズム)を許可します。ただし、/proc/sys/kernel/core_pattern
コアダンプを処理する方法はさまざまであるため、実際にこれを見て、何が起こっているのかを把握する必要があります。
あなたの場合、最初にコアが見つからなかった理由はわかりませんが、パイプを使用するときにリダイレクト:ハンドラを設定した後にコアのインポートを中断した理由はわかりますcore_pattern
。〜しなければならない絶対パス名を使用して指定します。tee
それ自体では使用されません/usr/bin/tee
。コアダンプを処理するプログラムはroot
。
Debian派生物にインストールしますcorekeeper
、使いやすい方法でコアダンプを作成します/var/crash
。
答え2
(問題の回答を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
core
2番目のコマンドを使用すると、コアダンプがdump
。しかし、私が知っている限り、一度に1つのコアダンプしか保存されないことに注意してください(新しいダンプが出るたびに以前のダンプは破壊されます)。プログラムを実行し、古いダンプをアーカイブする必要がないため、これは私と友達が作成してデバッグするほとんどのアプリケーションに最適なソリューションです。セグフォルトを引き起こしたPIDなどの項目を含めるように、この回答をさらに修正したい誘惑を感じます(主に一番上には砂糖しかありません。 )。しかし、これは確かに十分です。私と私は多くの人を想像しています。
最後に、実際にダンプを表示するには、次のコマンドを実行します。
gdb ./executable_that_crashed ~/path_you_wish_to_dump_to/core/dump
セグメントエラーが発生した実行可能ファイルがコンパイル/実行されたフォルダにあるとします。