2010-07-06 24 views
1

使用SOS,我可以得到方法表條目列表特定類:如何使用MethodDesc匹配CLR方法表項?

!DumpMT -MD 1d3c58 
PDB symbol for mscorwks.dll not loaded 
EEClass: 001d195c 
Module: 001d2f2c 
Name: Class1.B 
mdToken: 02000005 
BaseSize: 0xc 
ComponentSize: 0x0 
Number of IFaces in IFaceMap: 0 
Slots in VTable: 7 
-------------------------------------- 
MethodDesc Table 
    Entry MethodDesc  JIT Name 
691f6a90 69071248 PreJIT System.Object.ToString() 
691f6ab0 69071250 PreJIT System.Object.Equals(System.Object) 
691f6b20 69071280 PreJIT System.Object.GetHashCode() 
692674c0 690712a4 PreJIT System.Object.Finalize() 
001dc088 001d3c34  NONE Class1.B.M() 
001dc090 001d3c40  NONE Class1.B.N() 
001dc098 001d3c4c  JIT Class1.B..ctor()

但我無法弄清楚如何SOS可以匹配了一個MethodDesc一個表項 - 具有以方法一捅內存中的表只給出指向JIT存根的Entry值。我無法弄清楚如何從那裏獲得MethodDesc。有人有主意嗎?

回答

0

你可以從Class1.B..ctor()的項目獲取的方法描述

!dumpmd poi(001dc098-0x4) 

例如這裏是dumpmt

0:021> !dumpmt -md poi(0x18e3d90) 
EEClass: 012ef6a4 
Module: 00d42c5c 
Name: LINQPad.UserOptions 
mdToken: 02000002 (C:\Documents and Settings\naveen\My Documents\Downloads\LINQPad.exe) 
BaseSize: 0x3c 
ComponentSize: 0x0 
Number of IFaces in IFaceMap: 0 
Slots in VTable: 16 
-------------------------------------- 
MethodDesc Table 
    Entry MethodDesc  JIT Name 
03aa6aa0 03924924 PreJIT System.Object.ToString() 
03aa6ac0 0392492c PreJIT System.Object.Equals(System.Object) 
03aa6b30 0392495c PreJIT System.Object.GetHashCode() 
03b17410 03924980 PreJIT System.Object.Finalize() 
01321618 00d481ac  JIT LINQPad.UserOptions..ctor() 
01321458 00d481c0  JIT LINQPad.UserOptions..cctor() 
013214a8 00d48140  JIT LINQPad.UserOptions.get_Instance() 
01321580 00d4814c  JIT LINQPad.UserOptions.Load() 
01321650 00d48158  JIT LINQPad.UserOptions.Deserialize(System.String) 
00d4c249 00d48164  NONE LINQPad.UserOptions.Save() 
018c8410 00d48170  JIT LINQPad.UserOptions.get_TabSizeActual() 
00d4c251 00d4817c  NONE LINQPad.UserOptions.get_IsVBDefault() 
01325ef0 00d48188  JIT LINQPad.UserOptions.GetDefaultCustomSnippetsFolder() 
01325e00 00d48194  JIT LINQPad.UserOptions.GetCustomSnippetsFolder(Boolean) 
0db83d50 00d481a0  JIT LINQPad.UserOptions.get_ActualEditorBackColor() 
01321898 00d481b4  JIT LINQPad.UserOptions.<Deserialize>b__0(System.Reflection.FieldInfo) 

樣本這裏是參考回到方法描述從入門使用!dumpmd

0:021> !dumpmd poi(01321458-0x4) 
Method Name: LINQPad.UserOptions..cctor() 
Class: 012ef6a4 
MethodTable: 00d4838c 
mdToken: 0600000c 
Module: 00d42c5c 
IsJitted: yes 
CodeAddr: 01321458 

HTH

+0

我想在它自己的進程空間內使用不安全的代碼,而不是在調試會話中使用sos – thecoop 2010-07-08 09:09:27

+0

您是否計劃託管CLR?我不明白「不安全的代碼和自己的進程空間」。 CLR可以在調試器內反彙編。 – Naveen 2010-07-08 11:36:10

+0

我的另一個動機是獲得一個類型來處理不安全的代碼自己的vtable。在類型方法表中存儲的是JIT存根的地址,我需要將它們連接到方法的地址(通過方法委託的方法指針獲得)指向的地址,所以我可以更改它到別的東西。我知道這是非常邪惡的,但嘿:) – thecoop 2010-07-08 15:39:05