代码之家  ›  专栏  ›  技术社区  ›  Wesley Hill

如何查看优化的jitted.NET代码的反汇编?

  •  13
  • Wesley Hill  · 技术社区  · 15 年前

    出于这样或那样的原因,我有时会发现查看函数的优化编译器输出非常有用或非常有趣。

    对于非托管C/C++代码,我最喜欢的方法是编译发布模式,在断言中在断言中运行断点,在VisualStudio中运行并查看反汇编。

    我最近在一个C#项目中尝试了这个方法,发现这个技术不起作用。即使在发布模式下,我看到的反汇编显然也没有得到优化。我发现并禁用了(在VisualStudio2010中)调试。。。选项和设置。。。正在调试。。。将军。。。Suppress JIT optimization on module load”选项,这可以让我更接近我想要的,只是现在它在我尝试运行它时警告我,然后我就不能让它在断点处停止,这样我就可以看到反汇编了。

    所以,如果我想看到一个函数的CLR(4.0)抖动的分解优化输出,那么最好的方法是什么呢?为了清楚起见,我希望看到x86(或者最好是x86\u64)反汇编,而不仅仅是IL反汇编(您可以在Reflector中看到)。

    5 回复  |  直到 15 年前
        1
  •  17
  •   Wesley Hill    15 年前

    当然,经过半天的搜索,我找到了这个问题的答案,我自己5分钟后,我这样问。

    以下是完整的指南: http://blogs.msdn.com/b/vancem/archive/2006/02/20/535807.aspx

        2
  •  3
  •   Joe White    15 年前

    我相信JIT知道您什么时候在调试器下运行,并生成更“对调试器友好”的x86代码,这可以解释为什么您看到的x86代码没有优化。

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

        3
  •  1
  •   palota Tommy    8 年前

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

        4
  •  0
  •   leppie    15 年前

    您可以尝试检查一个NGEN的程序集,但这将是相当困难的,因为没有元数据存在。但它可以工作:)

        5
  •  0
  •   Dave Black    14 年前

    在VisualStudio下运行,无论您是否处于调试或发布模式,都将在调试器下运行。因为它是在调试器下运行的,所以无法使用优化的代码。