解決策 1:
より良い方法があるかもしれませんが、この種の方法はそれを自動化します。
以下を ~/backtrace
に入れます :
backtrace
quit
これを seg_wrapper.sh
というスクリプトに入れます パス内のディレクトリ:
#!/bin/bash
ulimit -c unlimited
"[email protected]"
if [[ $? -eq 139 ]]; then
gdb -q $1 core -x ~/backtrace
fi
ulimit
コマンドは、コアがダンプされるようにします。 "[email protected]"
はスクリプトに与えられた引数なので、プログラムとその引数になります。 $?
gdb
の場合 、 -q
静かな (イントロ メッセージなし)、および -x
を意味します。 gdb
を伝える 与えられたファイル内のコマンドを実行します。
使い方
したがって、それを使用するには、次のようにします:
seg_wrapper.sh ./mycommand and its arguments
更新
これを行うシグナル ハンドラを作成することもできます。このリンクを参照してください。
解決策 2:
2年後にここに来て申し訳ありません...何か他のものを探しているときに偶然見つけました.完全を期すためにこれを追加します。
1)受け入れられた答えは素晴らしいと思いますが、gdbが必要です。私がよく知っている方法では、libSegFault.so を使用します。
でアプリを実行する場合
<ブロック引用>LD_PRELOAD=...path-to.../libSegFault.so myapp
バックトレース、ロードされたライブラリなどを含むレポートが得られます
2) ラッパースクリプト catchsegv
addr2line
を使用しようとするものも利用可能です アドレスをファイル名 + 行番号に変換します。
これらは、コア ファイルや gdb よりもはるかに軽量なソリューションです (たとえば、組み込みシステムに適しています)。
解決策 3:
みんなの友達GDBが必要です
gdb <program> [core file]
コアファイルをロードしたら、コマンド 'backtrace' (省略して bt にすることができます) を実行すると、現在のコール スタックが表示されます。プログラムを gdb 内から実行すると、任意のブレークポイントを設定して、メモリの内容などを調べることができます。
解決策 4:
キャッチセグv
それは別の回答で言及されました(しかし、決して焦点を当てていません)。これは、glibc プロジェクトにバンドルされている便利なツールです。バックトレース (およびその他の有用なデバッグ情報) を提供するのは、次の場合のみです。 プログラムは実際に segfault を行います。
ここに良い記事があります。
必要に応じて独自のスクリプトに含めることができます。
解決策 5:
Ubuntu (プロジェクトとして) は、これを行うために Apport を使用します。彼らがどのようにそれを行ったかを見ることができます。
https://wiki.ubuntu.com/アポート