17

出于某种原因,我有时发现查看函数的优化编译器输出很有用或很有趣。

对于非托管 C/C++ 代码,我最喜欢的执行此操作的方法是在发布模式下编译,在感兴趣的函数中设置断点,运行,并在遇到断点时在 Visual Studio 中查看反汇编。

我最近在一个 C# 项目中进行了尝试,发现该技术不起作用。即使在Release模式下,我看到的反汇编显然也没有优化。我找到并禁用了(在 Visual Studio 2010 中)“调试...选项和设置...调试...常规...在模块加载时抑制 JIT 优化”选项,这大概让我更接近我想要的,只是现在当我尝试运行它时它会警告我,然后我无法让它在断点处停止,以便我可以看到反汇编。

那么,如果我想查看函数的 CLR (4.0) 抖动的反汇编、优化输出,那么最好的方法是什么?需要明确的是,我希望看到 x86(或者最好是 x86_64)反汇编,而不仅仅是 IL 反汇编(您可以在 Reflector 中看到)。

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 代码未优化。

您可以尝试独立运行应用程序,至少执行一次您感兴趣的代码(因此它在没有附加调试器的情况下进行 JIT),然后将调试器附加到进程并设置断点。

于 2010-08-06T12:21:15.400 回答
1

优化代码中的断点在内联函数中不起作用。如果要查看内联函数的反汇编,可以将命令System.Diagnostics.Debugger.Break();插入源代码。

于 2017-05-23T12:08:07.040 回答
0

无论您是处于 Debug 还是 Release 模式,在 VisualStudio 下运行仍将在 Debugger 下运行。因为它是在调试器下运行的,所以它不能与优化的代码一起工作。

于 2011-03-01T19:11:47.750 回答
0

您可以尝试检查 NGEN 的程序集,但这会非常困难,因为不存在元数据。但它可以工作:)

于 2010-08-06T12:13:25.963 回答