2008年12月10日水曜日

デバッガの理論と実装

デバッガってどうやって動いているの?と聞かれて正しく答えられなかったので。
デバッガの理論と実装 (ASCII SOFTWARE SCIENCE Language)デバッガの理論と実装 (ASCII SOFTWARE SCIENCE Language)
Jonathan B. Rosenberg 吉川 邦夫

アスキー 1998-02
売り上げランキング : 59943

Amazonで詳しく見る
by G-Tools


琴線にふれたところ。

ソースコードが直接実行されているかのような錯覚を与えることにある。そうするためのトリックは、ソースコードに関して、また、それがどのように機械語命令にマップされているかについて、コンパイラに徹底したデバッグ情報を提供させることである。
Microsoftなどのベンダーは、デバイスドライバ開発者のために、OSを2種類提供している。その1つは市販のバージョンで、完全に最適化され、デバッグ用のシンボル情報を持たない。もう1つは、Microsoftが「チェックされた」ビルドと呼んでいるもので、最適化を外すかそのレベルを下げるかした、完全なデバッグシンボル付きのビルドであり、デバッグ中に詳細なスタックトレースや主要な変数の調査ができるようになっている。
ハードウェアによるデバッグサポート
  • ブレークポイント
  • シングルステップ実行
  • 例外の検出
  • ウォッチポイント
  • マルチスレッドの制御
  • マルチプロセッサの制御
シングルステップ実行
デバッガは、現在のプロラムカウンタの位置にある命令をデコードし、正確にその次の命令の位置にブレークポイントを設定し、デバッギを通常どおりに実行させることによって、シングルステップをシミュレートすることができる。
ウォッチポイント
プロセッサにベースとリミットのレジスタを持たせ、それらで開始アドレスと範囲を指定する方法である。こうすればプロセッサ自身が、このアドレス領域内でのデータの書き換えをストップし、その書込みが行われる前に実行を停止することができる。
Win32のデバッグAPI
フラグを立ててCreateProcess()または、既存プロセスにDebugActiveProcess()
各スレッドのレジスタ値はGetThreadContext()、状態変更はSetThreadContext()
ブレークポイントやコードのパッチはReadProcessMemory()、WriteProcessMemory()
デバッギの状態変化をWaitForDebugEvent()で待つ。

0 件のコメント:

コメントを投稿