web-dev-qa-db-ja.com

デバッガーのブレークポイントはどのように機能しますか?

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

34
Shan

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

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

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

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

最初にブレークポイントを設定するには、バイナリに特別な情報を追加する必要があります.cソースファイルをコンパイルするときにフラグ-gを使用して、この情報を含めます。ソフトウェアデバッガーは実際にこの情報を使用してブレークポイントを設定します。私が経験したように、ハードウェアブレークポイントのサポートはVxWorksにあります。基本的に、ブレークポイントでプロセッサは停止します。したがって、内部的には、プロセッサに例外を与えるステップを使用して、ソフトウェアブレークポイントを配置できます。一方、ハードウェアブレークポイントは、ハードウェアレジスタに格納されたアドレスを照合して例外を発生させます。ハードウェアブレークポイントは非常に強力ですが、アーキテクチャに大きく依存します。

非常に良い説明はこちら ハードウェアブレークポイントとソフトウェアブレークポイントの違いは何ですか? プロセッサに関連する情報の良い紹介がここにあります http://processors.wiki.ti.com/index .php/How_Do_Breakpoints_Work

1
achoora