使用 WinDbg 附加到 .NET 程序时如何查看 JITted 方法的反汇编?

How can I view disassembly of a JITted method in a .NET program when attaching to it with WinDbg?

类似于this question asking the same but in VS,请问如何使用WinDbg查看JITted方法的反汇编?

将其分成两部分,在这两种情况下,我想要反汇编的方法相同 SomeNamespace.SomeClass.Foo()

  1. 我们只有可执行文件 program.exe,并希望通过 WinDbg 的 Open Executable.
  2. 运行 它
  3. 已经有一个 运行ning 过程,我想在其中检查相同的 JITted 方法。 (假设我们无法控制进程如何启动)

根据我的理解,JIT 运行 是第一次调用方法。如果这是真的,在 2. 中可能是该方法尚未 JIT 的情况。在这种情况下,有没有办法强制 JIT 在方法上 运行,以便我们可以检查结果?

TL;DR:如何使用 WinDbg 反汇编 JITted 方法?

您可以通过调用 PrepareMethod

强制执行 JIT 编译

在WinDbg和SOS中可以使用u命令查看反汇编。参见示例 here.

最后,也许你可以试试DumpMiner。这个UI工具,让你在不懂WinDbg的情况下查看jitted方法的反汇编

我不知道强制对方法进行 JIT 编译的方法,但是 ' 命令 !sosex.mbp(设置托管断点)在方法尚未编译时也有效,并且它会在 JIT 编译后立即中断。

之后,SOS 命令 !ip2md!dumpil!u 可能会有帮助。如果你知道JITted代码地址,你也可以在上面做一个nativeu

SOSEX作者@Steve Johnson在评论中提到,SOSEX还有命令!mu("managed unassemble")和!muf("managed unassemble function" ) 可以帮助处理已经 JIT 的函数。