我正在閱讀高級.NET調試書,我非常喜歡它。不過,我在例子中遇到了一些問題。如果有人讀過它,我會很感激。高級.NET調試
我有兩個問題:
對戰什麼版本的.NET框架的例子是建?我不能在windbg(x86)下運行它們,並且它們在windbg(x64)下加載,所以我認爲它是64位版本的框架。但是哪個框架? 2.0,3,3.5,4?
如第2章所述,當查看類型句柄(方法表)時,我得到了不同的結果(我的結果和下面顯示的書籍顯示)。當然,我不是在談論地址是不同的。例如,當我在方法表上看到不同的Flags2字段值時,NumMethods字段。我不知道爲什麼。在頁56作者說,對象的大小是0x14(在我的機器相同),因爲對象有4個整數。但是02TypeSample.cs的列表只顯示3個整數,x,y,z。在我的機器上,dd在顯示的例子中顯示了4種方法。書中還說編譯器生成了默認的ctor。
「首先要記住的一點是,即使我們沒有 沒有明確定義任何構造函數,C#編譯器自動生成一個 默認構造我們。
當上列出你可以看到TypeSample有。構造函數服用3個整數作爲參數,無論事情是我錯了,書或實例是什麼;?)
Method table from the book:
0:000>dd 002930b0
002930b0 00040000 00000014 00070402 00000004
002930c0 790fd0f0 00292c3c 002930f8 00291244
002930d0 00000000 00000000 79371278 7936b3b0
002930e0 7936b3d0 793624d0 003400c8 0029c015
002930f0 0034007000000000 00000080 00000000
00293100 00000000 00000000 00000000 00000000
00293110 00000000 00000000 00000000 00000000
00293120 00000000 00000000 00000000 00000000
My method table:
0:000> dd 00223420
00223420 00000000 00000014 00040011 00000004
00223430 68b70944 00222fe4 00223458 00221390
00223440 00000000 00000000 68ac6a90 68ac6ab0
00223450 68ac6b20 68b37700 00000080 00000000
00223460 00000000 00000000 00000000 00000000
00223470 00000000 00000000 00000000 00000000
00223480 00000000 00000000 00000000 00000000
00223490 00000000 00000000 00000000 00000000
it shows 4 methods when !dumpmt shows 7
0:000> !dumpmt -md 00223420
EEClass: 00221390
Module: 00222fe4
Name: Advanced.NET.Debugging.Chapter2.TypeSample
mdToken: 02000002 (F:\Development\Advanced .NET Debugging\adndsrc\Chapter2\TypeSample\TypeSample\bin\Debug\TypeSample.exe)
BaseSize: 0x14
ComponentSize: 0x0
Number of IFaces in IFaceMap: 0
Slots in VTable: 7
--------------------------------------
MethodDesc Table
Entry MethodDesc JIT Name
68ac6a90 6894494c PreJIT System.Object.ToString()
68ac6ab0 68944954 PreJIT System.Object.Equals(System.Object)
68ac6b20 68944984 PreJIT System.Object.GetHashCode()
68b37700 689449a8 PreJIT System.Object.Finalize()
003d00d8 00223398 JIT Advanced.NET.Debugging.Chapter2.TypeSample..ctor(Int32, Int32, Int32)
0022c015 002233a4 NONE Advanced.NET.Debugging.Chapter2.TypeSample.AddCoordinates()
003d0070 002233b0 JIT Advanced.NET.Debugging.Chapter2.TypeSample.Main(System.String[])
爲了獲得類似於書中內容的輸出,我下載了源代碼並將它們構建爲x86。來自books網站的二進制文件不會在windbg x86下運行。他們使用windbg x64工作,但所有地址都是64位,並不像書中那樣。 在我的第二個問題中,我列出了來自第43頁的2-5以及從第53頁開始的類型句柄部分。 – 2013-02-14 08:12:17
也在我看到的所有示例中:.loadby sos.dll mscorwks。所以它不能以CLR 4.0爲目標。我認爲mscorwks在CLR 4.0中被重命名爲clr。 – 2013-02-14 08:52:30
感謝您的更新。我會看看這本書,看看我能否理解它。我沒有看到消息來源,所以我不能對此發表評論。但是,當這本書出來後,我寫了作者,他很樂意回答我的問題。你可能想嘗試一下。你是正確的,該DLL在4.0中被重命名爲「clr.dll」。 'mscorwks.dll'是2.0的dll。這與「示例代碼」部分中的信息非常吻合。 – 2013-02-14 16:51:41