7

子プロセスをフォークするアプリケーションがあります。

子プロセスはいくつかの作業を行い、途中でセグメンテーション違反を引き起こします。これをデバッグするためにGDBを使用しました。

set follow-fork-mode child

また、子内の関数にブレークポイントを設定しました。しかし、GDB はブレークポイントで一時停止しません。

また、親プロセスが seg-fault を処理するため、ctrl-c で終了する必要がありました。次にbacktrace、スタックを印刷するために使用すると、得られるのは

スタックなし

ブレークポイントが設定されていないのはなぜですか? また、スタックを取得できなかったのはなぜですか?

4

1 に答える 1

9

ブレークポイントが設定されていないのはなぜですか

ブレークポイント設定されていますが、ヒットしていません...

なぜスタックを取得できなかったのですか?

...明らかに間違ったプロセスをデバッグしています。

を使用set follow-fork-mode childすると、GDBは作成した最初の子を追跡します。おそらくあなたは複数を作成しますか?

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

ハンドラーで、次のようにします。

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

メッセージが印刷されたら、別のウィンドウで次のようにします。

 gdb /proc/<pid>/exe <pid>
 (gdb) where
于 2012-03-04T16:57:45.813 に答える