ILレベルでのデバッグ方法

そうそう使わないけど、逆アセンブラとの兼ね合いで欲しくなることもあるので、備忘録的に。。。

やり方は、難しくは無いけど若干面倒。仕込み方は以下の通り。

  1. VisualStudio コマンドプロンプトを起動する
  2. Current directoryをコンパイルの成果物があるDirectoryに移動させる
  3. 仮に、成果物がhoge.exeの場合、まず最初にdasmにかけて、ilのソースコードを得る。"ildasm hoge.exe /OUT=hoge.exe.il /SOURCE"
  4. 次に、先に得たilをilasmに書けてpdb付きでアセンブルする。"ilasm hoge.exe.il /DEBUG"
  5. デバッグ用のダミープロジェクトをでっち上げる*1
  6. ダミープロジェクトのプロパティでデバッグペインを開き、開始動作を”外部プログラムの開始”にして、先の"hoge.exe.exe"を指定する。
  7. デバッグ開始

これでILレベルでステップデバッグが効く。
有りモノのコンパイル済み生成物を1回dasmして,もういっかい、アセンブルし直す理由は、ilベースのpdbファイルが欲しいから。また、ilasmのオプションを変更することで、様々な条件でデバッガを動かせる(と思う。)

若干蛇足だけど、ASMまで降りていく場合、ilasmで/debug=OPTを指定しても、デバッガ側の”モジュール読み込み中にJIT最適化を抑制する(マネージのみ)”のチェックを外しておかないと、恐らく、最適化されてないASMが生成されるような気がする*2

*1:中身は空でおっけ

*2:C#の場合、ASMが最適化されてない状態になり一度酷い目に遭った覚えがある。