【问题标题】:How can I view the disassembly of optimised jitted .NET code?如何查看优化后的 .NET 代码的反汇编?
【发布时间】:2011-03-26 07:28:18
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: .net clr jit disassembly


    【解决方案1】:

    当然,在这个问题上找了半天的答案,我在SO上问了5分钟后自己找到了答案。

    我很接近;我在问题中唯一缺少的一步是“启用我的代码”也必须在选项中取消选中。

    完整指南可在此处获得:http://blogs.msdn.com/b/vancem/archive/2006/02/20/535807.aspx

    【讨论】:

    • 当这种情况发生时你不喜欢(和讨厌)它吗? :)
    • @leppie:差不多。这是一个需要知道解决方案才能知道要搜索什么短语才能找到解决方案的案例......
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 这是真的吗?如果是这样,那么为什么您可以将调试器附加到独立于调试器运行的进程?不要忘记 VS 也可以调试本机应用程序,但您只会看到反汇编(汇编指令)而不是 C# 或 IL,而且您会看到寄存器而不是本地程序。如果您附加到未使用调试器启动的进程,我不确定您是否可以加载 SOS.dll 以进一步挖掘内存。另请注意,他们使用 .NET 4 iirc 更改了有关本机调试/仪器 API 的一些内容。
          猜你喜欢
          • 2011-05-26
          • 2021-06-23
          • 2013-07-24
          • 2010-12-02
          • 1970-01-01
          • 2010-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多