由于某种原因,我有时会发现查看函数的优化编译器输出是有用的还是有趣的。
对于非托管C / C ++代码,我最喜欢的方法是在Release模式下编译,在感兴趣的函数中粘贴断点,运行,并在Visual Studio遇到断点时查看反汇编。
我最近尝试使用C#项目并发现该技术不起作用。即使在Release模式下,我看到的反汇编显然也没有优化。我发现并禁用了(在Visual Studio 2010中)“调试...选项和设置...调试...常规...抑制模块加载时的JIT优化”选项,这可以让我更接近我想要的,只现在它在我尝试运行它时会发出警告,然后我无法让它停在断点上以便我可以看到反汇编。
所以,如果我想看一个函数的CLR(4.0)抖动的反汇编优化输出,那么最好的方法是什么?为了清楚起见,我想看看x86(或者最好是x86_64)反汇编,而不仅仅是IL反汇编(你可以在Reflector中看到)。
答案 0 :(得分:13)
当然,经过半天寻找答案后,我在问SO后5分钟就找到了答案。
我很亲密;我在问题中唯一缺少的一步是在选项中也必须取消选中“启用我的代码”。
完整指南可在此处找到:http://blogs.msdn.com/b/vancem/archive/2006/02/20/535807.aspx
答案 1 :(得分:3)
我相信JIT知道你何时在调试器下运行,并生成更多“调试器友好”的x86代码,这可以解释为什么你看到的x86代码没有被优化。
您可以尝试独立运行应用程序,至少执行一次您感兴趣的代码(因此JIT没有附加调试器),然后将调试器附加到进程并设置断点。
答案 2 :(得分:1)
优化代码中的断点不适用于内联函数。如果要查看内联函数的反汇编,可以将命令System.Diagnostics.Debugger.Break();
插入源代码中。
答案 3 :(得分:0)
您可以尝试检查NGEN的程序集,但由于不存在元数据,这将非常困难。但它可以工作:))
答案 4 :(得分:0)
无论您是处于调试模式还是发布模式,在VisualStudio下运行仍将在调试器下运行。因为它在调试器下运行,所以无法使用优化代码。