ILレベルでのデバッグ方法
そうそう使わないけど、逆アセンブラとの兼ね合いで欲しくなることもあるので、備忘録的に。。。
やり方は、難しくは無いけど若干面倒。仕込み方は以下の通り。
- VisualStudio コマンドプロンプトを起動する
- Current directoryをコンパイルの成果物があるDirectoryに移動させる
- 仮に、成果物がhoge.exeの場合、まず最初にdasmにかけて、ilのソースコードを得る。"ildasm hoge.exe /OUT=hoge.exe.il /SOURCE"
- 次に、先に得たilをilasmに書けてpdb付きでアセンブルする。"ilasm hoge.exe.il /DEBUG"
- デバッグ用のダミープロジェクトをでっち上げる*1
- ダミープロジェクトのプロパティでデバッグペインを開き、開始動作を”外部プログラムの開始”にして、先の"hoge.exe.exe"を指定する。
- デバッグ開始
これでILレベルでステップデバッグが効く。
有りモノのコンパイル済み生成物を1回dasmして,もういっかい、アセンブルし直す理由は、ilベースのpdbファイルが欲しいから。また、ilasmのオプションを変更することで、様々な条件でデバッガを動かせる(と思う。)
若干蛇足だけど、ASMまで降りていく場合、ilasmで/debug=OPTを指定しても、デバッガ側の”モジュール読み込み中にJIT最適化を抑制する(マネージのみ)”のチェックを外しておかないと、恐らく、最適化されてないASMが生成されるような気がする*2