17

何らかの理由で、関数の最適化されたコンパイラ出力を確認すると便利な場合や興味深い場合があります。

管理されていないC/C ++コードの場合、これを行うための私のお気に入りの方法は、リリースモードでコンパイルし、目的の関数にブレークポイントを固定し、実行して、ブレークポイントに達したときにVisualStudioで逆アセンブリを表示することです。

最近、C#プロジェクトでこれを試しましたが、その手法が機能しないことがわかりました。リリースモードでも、私が見る分解は明らかに最適化されていません。(Visual Studio 2010で)「デバッグ...オプションと設定...デバッグ...一般...モジュールロード時のJIT最適化の抑制」オプションを見つけて無効にしました。これにより、おそらく私が望むものに近づくことができます。これで、実行しようとすると警告が表示されますが、ブレークポイントで停止して、分解を確認することができません。

したがって、関数のCLR(4.0)ジッターの分解され最適化された出力を確認したい場合、それを実行するための最良の方法は何ですか?明確にするために、ILの逆アセンブル(Reflectorで確認できます)だけでなく、x86(またはできればx86_64)の逆アセンブルを確認したいと思います。

4

5 に答える 5

17

もちろん、これについての答えを半日探した後、SOで尋ねてから5分後に自分で答えを見つけました。

私は近かった。私が質問で持っていたものから欠落している唯一のステップは、「自分のコードだけを有効にする」もオプションでオフにする必要があるということでした。

完全なガイドはここから入手できます:http://blogs.msdn.com/b/vancem/archive/2006/02/20/535807.aspx

于 2010-08-06T12:17:16.293 に答える
3

JITは、デバッガーで実行していることを認識し、より「デバッガーに適した」x86コードを生成すると思います。これにより、表示されたx86コードが最適化されなかった理由が説明されます。

アプリをスタンドアロンで実行し、関心のあるコードを少なくとも1回実行してから(デバッガーを接続せずにJITするように)、デバッガーをプロセスに接続してブレークポイントを設定してみてください。

于 2010-08-06T12:21:15.400 に答える
1

最適化されたコードのブレークポイントは、インライン化された関数では機能しません。System.Diagnostics.Debugger.Break();インライン関数の逆アセンブリを表示する場合は、ソースコードにコマンドを挿入できます。

于 2017-05-23T12:08:07.040 に答える
0

NGENされたアセンブリを検査することもできますが、メタデータが存在しないため、それは非常に困難です。しかし、それはうまくいく可能性があります:)

于 2010-08-06T12:13:25.963 に答える
0

デバッグモードかリリースモードかに関係なく、VisualStudioで実行すると、デバッガーで実行されます。デバッガーで実行されているため、最適化されたコードでは機能しません。

于 2011-03-01T19:11:47.750 に答える