2016-07-22 64 views
1

我正在调试WinDbg/SOS的mscorlib 的源代码。我很好奇,如果你在汇编中看到它的地址,是否有可能得到托管函数的名字?例如,这是一些我看到的反汇编窗口代码:如何从SOS中的jitted输出获取托管函数名称?

00007ffd`7f035d7c 488d0d3d3af5ff lea  rcx,[System_Private_CoreLib_ni+0x8797c0 (00007ffd`7ef897c0)] 
00007ffd`7f035d83 e890728eff  call System_Private_CoreLib_ni+0x20d018 (00007ffd`7e91d018) 
00007ffd`7f035d88 488bf0   mov  rsi,rax 
00007ffd`7f035d8b b9874a0000  mov  ecx,4A87h 
00007ffd`7f035d90 e8834a91ff  call System_Private_CoreLib_ni+0x23a818 (00007ffd`7e94a818) 
00007ffd`7f035d95 488bc8   mov  rcx,rax 
00007ffd`7f035d98 e87356b9ff  call System_Private_CoreLib_ni+0x4bb410 (00007ffd`7ebcb410) 
00007ffd`7f035d9d 488bd0   mov  rdx,rax 
00007ffd`7f035da0 488bce   mov  rcx,rsi 
00007ffd`7f035da3 e8e89fbdff  call System_Private_CoreLib_ni+0x4ffd90 (00007ffd`7ec0fd90) 

我想找出一些这些功能是call -ed的名称。我想,要使用的命令因为这将是!dumpmd,但没有这些命令似乎工作:

!dumpmd 0x20d018 
!dumpmd e890728eff 
!dumpmd 00007ffd`7e91d018 

他们都用“......是不是一个方法描述”作出回应。那么怎样才能从程序集中获得托管函数的名称,或者这是不可能的?

的mscorlib最近更名为System.Private.CoreLib .NET的核心,所以这就是为什么你看到的那个,而不是mscorlib_ni

回答

2
!dumpmd 0x20d018 

不能工作,因为你只有通过偏移相对于模块。没有指定模块(System_Private_CoreLib_ni),!dumpmd无法知道您指的是什么。

!dumpmt e890728eff 

无法正常工作,因为您将机器代码传递给!dumpmte8是组装指令call的机器代码,其余部分是相对偏移量。为了解释这一点,!dumpmt需要知道指令的地址,以便它可以计算被调用方法的地址。

!dumpmt 00007ffd`7e91d018 

至少可能是合理的,因为您传递了绝对地址。这是一个有意义的地址。但它不是!dumpmt预期的方法表的地址。

对于给定的本地地址,你可以在代码中指定的地址已被JIT编译使用

!IP2MD <代码地址>显示的方法描述结构。

其实命令会显示更多,包括方法名称。

0:000> !ip2md 001fce80 
MethodDesc: 00508ab4 
Method Name: ReporterCmd.Program+<>c..cctor() 
Class:  0025e10c 
MethodTable: 00508ad0 
mdToken:  06000027 
Module:  00193fbc 
IsJitted:  yes 
CodeAddr:  001fce48 
Transparency: Critical 

download)命令!mln由@Steve Johnson实施和his answer提到的是真正有用的,因为它会自动检测最接近有用的东西,所以你不必详细知道你有什么。

0:000> !mln 001fce80 
Method instance: (BEGIN=001fce48)(MD=00508ab4 disassemble)[ReporterCmd.Program+<>c..cctor()] 

如果你正在学习.NET内部,我建议使用!mln,然后找出如何让使用其他方法相同的结果,让你知道的东西的关系。

2

传递整个地址!sosex.mln

相关问题