9

基本的な質問 & 私は C/C++ と GDB に非常に慣れていません。

GDB を使用してプロセスをデバッグします。GDB をプロセスにアタッチし、filename.c と行番号を指定してブレーク ポイントを配置します。

私の質問は、「GDB を実行中のプロセスに接続した後、指定された行番号 (filename.c 内) でブレークする必要があることを、GDB または OS または他の何かがどのように知るのでしょうか?」

たとえば、現在のプロセスがデバッグ モードで実行され、ブレークポイントが適用され、その時点でプロセスの実行を中断する (ユーザー入力を待機する) 必要があるとはどういうことでしょうか?

4

3 に答える 3

9

プログラムが特定のポイントで停止またはクラッシュした場合と同じように、デバッガーはそのポイントがプログラム内のどこにあるかを教えてくれます。

これらの両方が機能するには、プログラム バイナリに、プログラム イメージ内のアドレスをソース コード内の場所 (ソース ファイルと行番号) に関連付ける追加のデバッグ情報が含まれている必要があります。

特定の行にブレークポイントを追加するために、デバッガーはその行に最も近いプログラム アドレスを見つけ、メモリ内の実行可能ファイルのコピーを変更して、プログラムの実行を中断させる特別な「ブレーク」命令をその場所に挿入します。プログラムの実行をトレースし、ブレークポイントに到達して停止するのを待ちます。

詳細については、 http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1/およびhttp://www.howzatt.demon.co.uk/articles/SimplePTrace.htmlを参照してください。

于 2013-06-07T15:15:46.370 に答える
6

gdb の最新バージョンについてコメントすることはできませんが、多くのデバッガーは実際には、目的のブレークポイントの場所 (メモリ内) にあるアセンブリ命令を割り込み命令と交換しています。これにより、この時点で制御を引き継ぐデバッガが「起動」します。

代用割り込み命令を使用すると、CPU はプログラムを全速力で実行し、目的の場所で「トリップアップ」できることを意味します。

ただし、最新のプロセッサは非常に複雑で、おそらくはるかに優れたデバッグ機能を備えています。

于 2013-06-07T15:19:48.750 に答える
1

GDB はあなたのコードを認識しています: それはそれについてすべて知っています。行にブレークポイントを設定すると、GDB は同等のマシン命令アドレスを取得します。すべてのコード (マシン命令として) がメモリにロードされるため、コードの命令にはアドレスがあります。

これで、GDB はブレークしたい命令のアドレスを認識します。プログラムを実行すると、GDB は ptrace を使用します。これにより、GDB は実行前に各命令を「見る」ことができます。次に、GDBは現在の命令(実行される)が(ブレークしたい)命令と同じかどうかを確認する必要があります。

于 2013-06-07T15:17:20.920 に答える