41

親が特定のタスクを処理するために子をフォークするアプリケーションを開発しています。folk-mode の子をフォローするように gdb を構成した問題がありますが、フォーク後、ブレークポイントに到達した後、SIGTRAP を送信しますが、子は何らかの理由で終了し、SIGCHLD を親に送信します。

フォークの前に構成signal(SIGTRAP, SIG_IGN)したので、ブレークポイントに到達したときに子が SIGTRAP を継承して無視する必要があることを理解していますが、それは起こっていません。

私が間違っている場合は、これを理解するのを手伝ってください。

子プロセスを正常にデバッグするにはどうすればよいですか?

4

1 に答える 1

99

子プロセスは親プロセスからシグナル ハンドラーを継承しますが、保留中のシグナルは継承しません。

SIGTRAP分岐後、分岐後に子プロセスが実行されるコード内の場所にシグナル ハンドラをインストールしてみてください。を処理しない場合SIGTRAP、デフォルトのアクションは、子が終了することです。

子プロセスをデバッグする場合は、follow-fork-mode. を使用してモードを設定する必要があります

set follow-fork-mode child

ただし、現在は子のみをデバッグでき、親は未チェックで実行されます。

子プロセスをデバッグする別の方法があります。

の実行後、子が実行されるコードに呼び出しをfork()入れ、ユーティリティを使用して子の PID を取得し、PID を添付します。sleep()ps

attach <PID of child process>

これで、他のプロセスと同様に、子プロセスをデバッグできます。

デバッグ後、次を使用して PID を切り離すことができます。

detach
于 2013-02-28T05:03:27.900 に答える