デバッガ:プロセッサのサポート

デバッガ:プロセッサのサポート

プロセッサ = CPUの基本的なデバッグサポートについて紹介しています。


基本的なアーキテクチャ

CPUの種類によらない基本的なアーキテクチャです。

ブレークポイント

ブレークポイントを実現することはデバッガを作る上で欠かせないものですが、最近のCPUではこれが二通りのやり方でサポートされています。

      1. ブレークポイントを設定したい個所の命令を一度退避しておき、代わりにトラップ命令を置く
      2. その個所でトラップが発生した場合、それをOSに通知する
      3. 実行を再開する前に以前あった命令を書き戻しておく
      4. CPU命令を一つだけ実行する
      5. 直前にブレークした個所にあらためてトラップ命令を置く
      6. 通常実行を開始する

プロセッサを1命令ずつ実行させる特別なモード

プロセッサを1命令ずつ処理します。シングルステップ実行とも言います。

この機能がCPU上に存在しない場合でも、デバッガはこれをエミュレートすることが可能です。具体的には、実行コードをデコードしその次にある命令にトラップを仕掛けることによってシングルステップ実行を可能にします。そのトラップにかかった段階で、以前の命令を書き戻し、それから通常実行を開始するのです。

これはCPUに必ずしも必要な機能というわけではありませんし、実際にないCPUも存在します。ちなみにx86ではTFレジスタを切り替えることによりこのモードを発動させることが可能です。

データブレークポイント(ウォッチポイント)

データブレークポイントとは、ある特定のアドレスの書き込み時、ないし読み込み時にデバッギの中断を行う機能です。GCの障害など実行コードのトレースだけでは分かりにくいメモリ関係のバグを発見するのに役立ちます。これにも実行コードと同じように、ハードウェアによるものとソフトウェアによるものがあります。

ときには、特殊なデバッグ用レジスタ

その名のとおり、特殊用途に使われるレジスタのことです。これには例えば、ハードウェアブレークポイントやコードブレークポイントを実現するためのレジスタが含まれます。

マルチスレッド、マルチプロセッサのサポート

当然のことながら、デバッグ用の機能というわけではありません。

例えばスレッドの作成と消滅、停止をデバッガに通知する手段があれば、マルチスレッドにおけるデッドロックは完全にデバッガが把握できるようになります。スレッド停止時にその理由やコードアドレスがデバッガに通知されれば、デバッガはどこでどのような理由でスレッドが止まったのかが分かります。このためデッドロックになった場合でも、どこでどのような理由でデットロックになったのかがすぐに分かるようになります。

残念なことに、ネイティブ環境のデバッガではそのためのコストがあまりに高いことやOSのサポートが十分でないなどの理由からあまり実装されることはないようです。(コストというのは、デバッギからOS→OSからデバッガ→デバッガからOS→OSからデバッギ、の通知サイクルに対してかかるコストのことです)


Last modified : 2009/01/30 12:07:00 UTC