2010-12-01 6 views
1

私はGDB(Cコード)でデバッグしています。問題は私がアプリケーションを実行し、クラッシュした場合、コントロールがmain()に戻ります(アプリケーションが再起動します)。したがって、どこが墜落したのかは分かりません。だから、私は各機能を踏み出すのに多くの時間を費やしています。gdbデバッグクラッシュロギングのヘルプ

クラッシュする前に最後の実行行を生成するログが有効になっているかどうかを知りたいと思います。これは単なる私の前提です。これを行うための他の簡単な方法があれば、私に教えてください。

また、gdbがログを生成する場合、パスはどこですか?

ありがとうございます。

+2

"クラッシュ"を定義できますか?ハンドルされていないシグナル(例えばSIGSEGV)がある場合、GDBはそれを傍受して直ちに停止しますが、それは起こっていないように聞こえるので、別の方法で "クラッシュ"する必要があります –

+1

GDBはcannedコマンドを処理できます。または、ログでスタックトレースを意味する場合は、http://tlug.up.ac.za/wiki/index.php/Obtaining_a_stack_trace_in_C_upon_SIGSEGVを参照してください。 SIGSEGVでスタックトレースを生成する方法を示します。あなたのクラッシュの原因となっている信号が分かっている場合は、SIGSEGVの代わりにその信号を受信したときにスタックトレースを生成してください。 – vpit3833

+0

main()とアプリケーションの再起動の制御は、実際には同じではありません。main()の1行目で本当に再起動しているのですか?あるいは、関数呼び出しの後に復帰して戻りますか? – Cascabel

答えて

3

この質問は、私にはちょっと不明であるが、私は刺し取るよ:あなたはGDBそれがクラッシュクラッシュしたプロセスに接続している場合は、クラッシュプログラムを停止する必要があります

をして戻ってあなたを置きます(gdb)プロンプトが表示されます。 btと入力すると、スタックが表示されます。

GDBが添付されていない場合は、、次にthis answer to a related questionが役立ちます。コアダンプは、クラッシュしたプロセスに関する多くの情報を含むファイルです.GDBをコアダンプとともに使用すると、スタックを見ることができます。 )

わからない場合は、は、これが起こったときに画面に表示されるものを投稿します。

いずれにしても、プログラムは確実にmain()で開始されるべきではありません。なぜこれが起こり、何が起こっているのかを追跡することは価値があるようです。コントロールは実際に同じプロセス内でmainにジャンプしますか?、何らかの方法で自動的に開始されますか?

0

プログラムをgdbモードで実行します。

$ gdb ./myProgram 


予想される位置にブレークポイントを設定します。

$ break functionName 


または、特定の行番号にブレークポイントを設定します。プログラムがクラッシュ一度

$ break 15 


スタート実行

$ r 


ステップへまたは'S' による実行をステップアウトまたは 'n' の

$ s 


、んバックトレース用の'bt'

$ bt 


あなたはまた、別の方法を取ることができコマンド

$ up 


'ダウン' 'アップ' &でダウンあなたのトレースで上がることができます。 "core"をコアダンプファイルとしてデバッグします。

$ gdb executableFilename core 
$ bt