web-dev-qa-db-ja.com

fork後の子プロセスのデバッグ(follow-fork-mode子が設定されている)

親が特定のタスクを処理するために子を分岐するアプリケーションを開発しています。私はgdbをfollow-fork-modeの子に設定しましたが、分岐後、ブレークポイントに到達した後、SIGTRAPを送信しますが、子は何らかの形で終了し、SIGCHLDを親に送信するという問題があります。

Forkの前にsignal(SIGTRAP, SIG_IGN)を設定したので、ブレークポイントに到達したときに子がSIGTRAPを継承して無視する必要があるが、それは起こっていないというのが私の理解です。

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

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

29
ihsan

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

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

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

_set follow-fork-mode child
_

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

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

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

_attach <PID of child process>
_

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

デバッグ後、次を使用してPIDをデタッチできます。

_detach
_
75