37

ブレークポイントは、GDB などの最も人気のあるデバッガーでサポートされている最もクールな機能の 1 つです。しかし、ブレークポイントはどのように機能するのでしょうか? ブレークポイントを達成するために、コンパイラはどのようなコード変更を行いますか? ブレークポイントをサポートするために使用される特別なハードウェア機能はありますか?

4

2 に答える 2

26

コンパイラは、ブレークポイントをサポートするためにバイナリを「変更」する必要はありません。ただし、次のことが重要です。

  • コンパイラーは、実行可能ファイル (コード自体ではなく、同じファイル内の特別なセクション) に十分な情報を含めて、デバッガーがユーザーがデバッグしたいソースをマシンコードと関連付けることができるようにします。(アドレスを直接指定しない限り) ブレークポイントを設定できるようにするためにデバッガーが知る必要がある一般的なことの 1 つは、プログラム関数とソース コードの行が (マシン コード内で) どこで (どのアドレスで) 開始されるかです。
  • コードはコンパイラによって最適化されていないため、ソース コードとマシン コードを関連付けることができません。通常、最適化されていないデバッグ コード、または慎重に選択された最適化のみが実行されたコードが必要になります。

残りの作業は、デバッガ自体によって実行されます。

  1. ソフトウェア ブレークポイントは、必ずしも特別なハードウェア機能を必要としません。ここでのデバッガーは、元のバイナリ (メモリに読み込まれるのはコピーです) の変更に依存しています。ブレークポイントを設定すると、デバッガーはブレークポイントの場所に特別な命令を配置します。この特別な命令は、デバッガーがそれ (この特別な命令) が実行されていることを検出できるようにする必要があります。これは、デバッガーがフックできる何らかの割り込み/例外を引き起こす命令、またはデバッグユニットへの制御を処理する命令である可能性があります。これが一部の OS で実行される場合、その OS は実行中のプログラムの変更をサポートする必要があります (ptrace poke/peek などを使用)。SW ブレークポイントの欠点は、デバッガーが実行中のプログラムを変更できる必要があることです。これは、プログラムが何らかの読み取り専用メモリから実行されている場合は不可能です (組み込みの世界では非常に一般的です)。
  2. ハードウェア ブレークポイント (CPU でサポートする必要があります) は、プログラム バイナリを変更せずに同様の動作を実装します。これは CPU 固有ですが、通常は、実行がブレークポイントにヒットするプログラム アドレスを少なくとも定義することができます。CPU は現在の PC をこれらのブレークポイント アドレスと継続的に比較し、条件が一致すると実行を中断します。これらのブレークポイントの数は常に制限されています。
于 2013-01-30T08:43:16.350 に答える