2016-06-18 2 views
1

デバッガセッションで、デバッガがブレークポイントを設定したい場合、デバッガは命令をint3で置き換えます。ターゲットプロセスがこの命令に到達すると、プロセスは停止する。私は、この時点で信号が送信されていることを読んでいます。しかし、私はこの信号を捕まえることができませんでした(私はテストのために私自身のミニデバッガを書きました)。誰がこの信号を送るのですか?カーネル?そして受信者は誰ですか? 私はptrace_contの後にwait()関数を置く必要がありました。プロセスがブレークポイントに到達したことをデバッガに通知するために信号を捕まえるこの待機関数だと思いますか?中断3の場合にSIGTRAPを送信し、誰が嫌うか?

答えて

1

ターゲットプロセスがこの命令に到達すると、プロセスは停止します。

これはあまり正確ではありません。トラップ命令(0xCC on x86)が実行されると、プロセッサはOSに通知します。 UNIXの場合、OSは誰かによってプロセスがptraceであるかどうかをチェックします。

いいえの場合、SIGTRAPシグナルがアプリケーションに配信されます。通常、プロセスが強制終了されますが、アプリケーションで信号を捕捉して処理することができます。

ptrace(通常はデバッガ)の場合、信号はアプリケーションには配信されません。代わりに、デバッガのwaitがブロックされ、デバッガに下位オブジェクトの状態が変更されたことが通知されます。デバッガは、下位プロセスがどこで停止したかを調べ、ブレークポイントのためにそのようになったことを発見し、状況を適切に処理します(下位コンポーネントを調べてみましょう。または、ブレークポイントが条件付きで、等)

関連する問題