How to disable optimizations when debugging Reference Source
Visual Studio 2008 を使えば、.NET Framework のソースコードをデバッグできるのだが、コードが最適化されているせいで、変数の値が覗けない場合がある。そんなときはこれを試してみよう。
以下は訳。誤訳たっぷりと思われるので、できれば本文を参照してほしい。
新しい Reference Source を使って .NET Framework をデバッグしたら、多くの変数が見えない事にもう気づいたよね。
これは、配布用に最適化されたコードをデバッグしているからなんだ。まぁ殆どの場合、スルーしても問題ないけどね。
でも、何が本当に起こっているのか知りたいときもあるよね? 幸運にも方法があるんだ。
pre-JIT(NGEN の事だよ)していないイメージをロードするように CLR に教えてやればいいんだ。その方法はこうだ。
まずは、環境変数を設定する CMD ファイルを作って、そこから Visual Studio を起動してくれ。僕はこれを「NoOptDevEnv.cmd」と呼んでいる。ファイルの中身は以下だ。
set COMPLUS_ZapDisable=1
cd /d "%ProgramFiles%\Microsoft Visual Studio 9.0\Common7\ide\"
start devenv.exe
exit
僕はこのファイルはデスクトップに置いた。最適化を殺したいときだけ、このコマンドから VS を起動しているんだ。
自分の Visual Studio プロジェクトに、一回だけ以下の手順を実行する必要がある。
1) プロジェクトファイルを右クリックして「プロパティ」を選択。
2) 「デバッグ」を選んで「Enable the Visual Studio Hosting Process」のチェックを外す。
3) アプリケーションをデバッグする。
これで、全ての変数がきっと見えるだろう。
もしかしたら、こう思ってるんじゃないかな。「Visual Studio Hosting Process(VSHost の事だよ)って一体何なのよ? そしてそれを殺す事で何が起こるの?」 ん~、いい質問だね。
VSHost を殺しても殆ど意味はないかもしれないんだけど、もしかしたら君が有効にしているかもしれない 2 つの事を無効にできるんだ。
一つ目は、「Debug In Zone」が無効になる。これは「Internet」や「Intranet」のようなセキュリティゾーンのコンテキストでデバッグできる機能だ。これは VSHost なしでは動かないんだ。
二つ目は、「Design Time Expression Evaluation」が動かなくなる。そうなると、例えば、クラスライブラリを開発しているとき、デバッグ中にイミディエイトウィンドウでコードを実行できなくなる。
まぁ、デバッグが終わったら、VSHost を再有効(さっき挙げた手順2を戻す)事をお勧めするよ。
コレが役に立ったら嬉しいな。