Win32デバッグ(5)・・・動的コールグラフ
前回までで、Win32のデバッグAPIそしてTD32デバッグ情報について述べ、これで、色々できるようになったので、なんか、実用的というより現実的?なソフトウェアを作ってみる
。
お題はタイトルにもあるように動的コールグラフ生成ツール。動的コールグラフとは、実行時の各ルーチンの呼び出し関係を表すグラフの事であるが、これを生成するツールを作ってみる。
ということで開始するのであるが、今回はそのための基本的な事柄・設計や処理のおおまかな流れについて。
まず、動的コールグラフを作成するには各ルーチンの呼び出しを検出する必要があるが、この方法について。色々なやり方があるのかもしれないが、ここでは、x86系プロセッサに備わっているソフトウェアブレークポイントと呼ばれるINT 3命令(ブレークポイント命令)とシングルステップモードを使用する方法を採用する。
INT 3命令とは、x86プロセッサの命令の1つで、実行されるとブレークポイント(BP)例外というトラップクラスの例外が発生する。例外が発生するとCPUは指定された例外ハンドラと呼ばれるルーチンに制御を移すが、通常、その例外ハンドラはOSによって提供され、Windowsの場合、INT 3命令を実行したスレッドのプロセスがデバッグされていると、例外コードEXCEPTION_BREAKPOINTのDEBUG_EXCEPTIONイベントとして、通知されるのでこれをルーチンの開始と終了の検出に利用する。
具体的にはプロセスのアドレス空間内のルーチンのコードの開始と終了位置の命令をINT 3命令に置き換え、ブレークポイントを設定する。置き換えられた元の命令はルーチンの開始または終了の検出後に実行する必要があるので退避する。また、ルーチンのコードの開始と終了位置はロードされたモジュールのベースアドレスとデバッグ情報から求まる。
DEBUG_EVENTイベント発生時(ブレークポイント例外)には、ルーチンの開始または終了の検出に応じてコールグラフを成長させる。また、ContinueForDebugEvent関数による実行の再開において、INT 3命令で置き換えられた元の命令を実行する必要があるので、ブレークポイントを解除し、元の命令に戻すのであるが、この時、再び同じルーチンの呼び出しを検出するため、シングルステップモードで実行を再開する。シングルステップモードにするとCPUは1命令を実行した直後にフォルトクラスのデバッグ(DB)例外を発生させる。これはWindowsでは例外コードEXCEPTION_SINGLE_STEPのDEBUG_EXCEPTIOINイベントとして通知される。
DEBUG_EVENTイベント例外発生時(シングルステップ例外)には、上記の通り、該当のブレークポイントを再設定する。
これらをデバッグイベント別にまとめると次のようになる。
- CREATE_PROCESS_EVENTイベント発生時
- ロードされたモジュールにデバッグ情報があれば、必要に応じて各ルーチンのコードの開始・終了位置にブレークポイントを設定
- LOAD_DLL_EVENTイベント発生時
- ロードされたモジュールにデバッグ情報があれば、必要に応じて各ルーチンのコードの開始・終了位置にブレークポイントを設定
- UNLOAD_DLL_EVENTイベント発生時
- アンロードされたモジュールで設定されている全てのブレークポイントを解除
- EXIT_PROCESS_EVENTイベント発生時
- アンロードされたモジュールで設定されている全てのブレークポイントを解除
- EXCEPTION_EVENTイベント発生時
- ブレークポイント例外(例外コードEXCEPTION_BREAKPOINT)
- ブレークポイント例外が発生したアドレスから自身が設定したブレークポイントによる例外かを判定。もし、そうならブレークポイントを解除し、その位置からシングルステップモードで実行再開
- シングルステップ例外(例外コードEXCEPTION_SINGLE_STEP)
- 該当のブレークポイントを再設定。
- ブレークポイント例外(例外コードEXCEPTION_BREAKPOINT)
こんな感じだろうか???(LOAD_DLL_EVENT、EXIT_PROCESS_EVENTイベント発生時にブレークポイントをわざわざ解除する必要がないかもしれない・・・とかそういう細かい事は気にしない
)。
今回はここまでで、次回実際にクラス設計を行ってみる。
| 固定リンク
「Windows」カテゴリの記事
- Win32デバッグ(12)・・・SEH(Structured Exception Handling)(2009.10.07)
- Win32デバッグ(11)・・・番外編(2009.10.06)
- Win32デバッグ(10)・・・泣(2009.09.30)
- 間隔(インターバル)型の続き(2009.08.23)
- Win32デバッグ(9)・・・逆アセンブラ(2009.08.15)
「デバッグ」カテゴリの記事
- Win32デバッグ(12)・・・SEH(Structured Exception Handling)(2009.10.07)
- Win32デバッグ(11)・・・番外編(2009.10.06)
- Win32デバッグ(10)・・・泣(2009.09.30)
- Win32デバッグ(9)・・・逆アセンブラ(2009.08.15)
- Win32デバッグ(8)・・・そして(2009.08.14)

コメント