2012-03-04 11 views
6

私は、子プロセスをフォークするアプリケーションを持っています。GDBバックトレース(子プロセス)

子プロセスはいくつかの作業を行い、途中のどこかでセグメント化エラーが発生します。私はこれをデバッグするためにGDBを使用しました。私は、以下のように使用しました。私はまた、子内の関数にブレークポイントを設定しました。しかし、GDBは私のブレークポイントで一時停止しません。

また、親プロセスがseg-faultを処理するので、終了するにはctrl-cを実行する必要がありました。私は、スタックを印刷するbacktraceを使用する場合それから私は得たすべてである

ませんスタックブレークポイントが設定されていないと私はスタックを取得しなかった理由はなぜ

+0

あなたによって書かれた子プログラムです:?あなたが別のウィンドウで、印刷されたメッセージが表示されたら

void handler(int signo) { int i = 1; fprintf(stderr, "pid=%d, got signal=%d\n", getpid(), signo); while (i) { } } 

を – sirgeorge

+0

いいえ、私にはソースがあります。 – broun

+0

デバッグモードでソース(子)をビルドできますか? – sirgeorge

答えて

7

はなぜブレークポイントは、ブレークポイントが設定されているですが、それが原因で...

を押すと、なぜ私が取得していないされていない

に設定されていませんスタック?

...間違ったプロセスをデバッグしているようです。

set follow-fork-mode childとすると、GDBは最初にという子を作成します。おそらくあなたは複数を作成するでしょうか?

これをデバッグする1つの方法は、signalまたはsigactionを使用してSIGSEGVハンドラを確立することです。ハンドラで

、この操作を行います。

gdb /proc/<pid>/exe <pid> 
(gdb) where 
+0

ありがとうございます。 –

関連する問題