与this question asking the same but in VS类似,我想问一下如何使用WinDbg查看JITted方法的反汇编?
将其分成两部分,在这两种情况下都有我想要反汇编的SomeNamespace.SomeClass.Foo()
方法。
program.exe
,并希望通过WinDbg' s Open Executable
运行它。根据我的理解,JIT在第一次调用方法时运行。如果这是真的,那么在2.
中可能会出现该方法尚未被JIT实施的情况。在这种情况下,有没有办法强制JIT在方法上运行,以便我们可以检查结果?
TL; DR:如何使用WinDbg反汇编JITted方法?
答案 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'命令!sosex.mbp
(设置管理断点)也可以在方法尚未被jitted时使用一旦JIT编译就会中断。
之后,SOS命令!ip2md
,!dumpil
和!u
可能会有所帮助。如果您知道JITted代码地址,您还可以在其上执行本地u
。
正如SOSEX的作者@Steve Johnson所述,在评论中,SOSEX还有命令!mu
(“托管unassemble”)和!muf
(“托管unassemble函数”)帮助已经JITted功能。