親が特定のタスクを処理するために子を分岐するアプリケーションを開発しています。私はgdbをfollow-fork-modeの子に設定しましたが、分岐後、ブレークポイントに到達した後、SIGTRAPを送信しますが、子は何らかの形で終了し、SIGCHLDを親に送信するという問題があります。
Forkの前にsignal(SIGTRAP, SIG_IGN)
を設定したので、ブレークポイントに到達したときに子がSIGTRAPを継承して無視する必要があるが、それは起こっていないというのが私の理解です。
私が間違っている場合、これを理解するのを助けてください。
子プロセスを正常にデバッグするにはどうすればよいですか?
子プロセスは親からシグナルハンドラを継承しますが、保留中のシグナルは継承しません。
分岐後、子プロセスが分岐後に実行されるコード内の場所にSIGTRAP
のシグナルハンドラをインストールしてみてください。 SIGTRAP
を処理しない場合、デフォルトのアクションは子が終了することです。
子プロセスをデバッグする場合は、_follow-fork-mode
_を使用する必要があります。を使用してモードを設定する必要があります
_set follow-fork-mode child
_
ただし、現在は子のみをデバッグでき、親はチェックなしで実行されます。
子プロセスをデバッグする 代替方法 があります。
fork()
が実行された後、sleep()
呼び出しを子が実行するコードに入れ、ps
ユーティリティを使用して子のPIDを取得し、PIDを添付します。
_attach <PID of child process>
_
これで、他のプロセスと同様に、子プロセスをデバッグできます。
デバッグ後、次を使用してPIDをデタッチできます。
_detach
_