2016-07-22 61 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

相關問題