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

时间:2016-10-06 22:41:06

标签: c# .net windbg jit disassembly

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

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

  1. 我们只有可执行文件program.exe,并希望通过WinDbg' s Open Executable运行它。
  2. 我已经在运行的过程中要检查相同的JITted方法。 (假设我们无法控制流程如何开始)
  3. 根据我的理解,JIT在第一次调用方法时运行。如果这是真的,那么在2.中可能会出现该方法尚未被JIT实施的情况。在这种情况下,有没有办法强制JIT在方法上运行,以便我们可以检查结果?

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

2 个答案:

答案 0 :(得分:1)

您可以通过调用PrepareMethod

强制进行JIT编译

您可以在WinDbg和SOS中使用// Perform insert and expect id to be returned TableA tableA = new TableA(); jpaRepositoryForTableA.save( tableA ); // Use the tableA in the next mybatis mapper TableB tableB = new TableB(); tableB.setTableAId( tableA.getId() ); this.mapper.saveTableB( tableB ) 命令查看反汇编。请参见示例here

最后,也许你可以试试DumpMiner。这个UI工具,让您在不知道如何使用WinDbg

的情况下查看jitted方法的反汇编

答案 1 :(得分:1)

我不知道强制JIT编译方法的方法,但'命令!sosex.mbp(设置管理断点)也可以在方法尚未被jitted时使用一旦JIT编译就会中断。

之后,SOS命令!ip2md!dumpil!u可能会有所帮助。如果您知道JITted代码地址,您还可以在其上执行本地u

正如SOSEX的作者@Steve Johnson所述,在评论中,SOSEX还有命令!mu(“托管unassemble”)和!muf(“托管unassemble函数”)帮助已经JITted功能。