2

デバッガーは、解釈されたプログラムについて話しているときに完全に理にかなっています。命令は実行前に検証のために常にインタープリターを通過するためです。しかし、コンパイルされたアプリケーションのデバッガーはどのように機能するのでしょうか? 命令が既にメモリに配置されて実行されている場合、「ブレークポイント」に到達したこと、または「例外」が発生したことをどのように通知できますか?

4

1 に答える 1

2

ハードウェアおよび/またはオペレーティング システムの助けを借りて。

最近のほとんどの CPU には、特定のアドレスに到達したときに CPU 例外をトリガーするように設定できるいくつかのデバッグ レジスタがあります。多くの場合、アプリケーションが指定されたアドレスまたはアドレス範囲に対して読み取りまたは書き込みを行うときに例外をトリガーするアドレス ウォッチポイントと、プロセスが単一の命令を実行して例外をスローするシングル ステップもサポートします。これらの例外は、プログラムに接続されているデバッガーによってキャッチできます (以下を参照)。

あるいは、一部のデバッガーは、ブレークポイントの命令を一時的に割り込みまたはトラップ命令に置き換えることによってブレークポイントを作成します (これにより、プログラムは CPU 例外を発生させます)。ブレークポイントに到達すると、デバッガーはそれを元の命令に置き換え、CPU をその命令を通過するようにシングルステップさせて、プログラムが正常に動作するようにします。

例外に関する限り、それは作業しているシステムによって異なります。UNIX システムでは、デバッガーは通常、ptrace()システム コールを使用してプロセスにアタッチし、そのシグナルを処理する最初のショットを取得します。

TL;DR - 低レベルの魔法。

于 2013-05-22T20:10:04.937 に答える