2013-02-13 90 views
4

我正在閱讀高級.NET調試書,我非常喜歡它。不過,我在例子中遇到了一些問題。如果有人讀過它,我會很感激。高級.NET調試

我有兩個問題:

  1. 對戰什麼版本的.NET框架的例子是建?我不能在windbg(x86)下運行它們,並且它們在windbg(x64)下加載,所以我認爲它是64位版本的框架。但是哪個框架? 2.0,3,3.5,4?

  2. 如第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[]) 

回答

1

的博回好吧,它說目標是.NET CLR 4.0。但是,前言的示例代碼部分指出,所有代碼都是使用C#和.NET 2.0編寫的。最後在.NET 4.0上有一章。

上面的!dumpmt命令的輸出顯然是32位(x86),因爲Entry列是一個指針。

至於你的第二個問題。你能否指定你指的是哪個例子。

+0

爲了獲得類似於書中內容的輸出,我下載了源代碼並將它們構建爲x86。來自books網站的二進制文件不會在windbg x86下運行。他們使用windbg x64工作,但所有地址都是64位,並不像書中那樣。 在我的第二個問題中,我列出了來自第43頁的2-5以及從第53頁開始的類型句柄部分。 – 2013-02-14 08:12:17

+0

也在我看到的所有示例中:.loadby sos.dll mscorwks。所以它不能以CLR 4.0爲目標。我認爲mscorwks在CLR 4.0中被重命名爲clr。 – 2013-02-14 08:52:30

+0

感謝您的更新。我會看看這本書,看看我能否理解它。我沒有看到消息來源,所以我不能對此發表評論。但是,當這本書出來後,我寫了作者,他很樂意回答我的問題。你可能想嘗試一下。你是正確的,該DLL在4.0中被重命名爲「clr.dll」。 'mscorwks.dll'是2.0的dll。這與「示例代碼」部分中的信息非常吻合。 – 2013-02-14 16:51:41

1

要構建X86程序集,您可以修改構建XML。提供的XML似乎將程序集構建爲64位窗口上的X64。