4

Advanced .NET Debugging の本を読んでいて、とても気に入っています。ただし、例にはいくつか問題があります。読んだことがある人が助けてくれたら本当にうれしいです。

2 つの質問があります。

  1. どのバージョンの .NET Framework がビルドされた例ですか? 私はそれらをwindbg(x86)で実行できず、windbg(x64)でロードするので、フレームワークの64ビットバージョンだと思います。しかし、どのフレームワークですか?2.0、3、3.5、4?

  2. 第 2 章で説明したように型ハンドル (メソッド テーブル) を見ると、異なる結果が得られました (私の結果と本が示す内容を以下に示します)。もちろん、アドレスが違うという話ではありません。たとえば、メソッド テーブルを追加すると、Flags2 フィールド、NumMethods フィールドに異なる値が表示されます。理由がわかりません。56 ページで、著者は、オブジェクトには 4 つの整数があるため、オブジェクトのサイズは 0x14 (私のマシンでも同じ) であると述べています。しかし、02TypeSample.cs のリストには、x、y、z の 3 つの整数しか表示されません。私のマシンでは、dd は例では 7 を示しているのに 4 つのメソッドを示しています。また、コンパイラがデフォルト ctor を生成したとも書かれています。

    「最初に覚えておくべきことは、コンストラクターを明示的に定義していなくても、C# コンパイラーがデフォルトのコンストラクターを自動的に生成したことです。

    リストすると、TypeSample には 3 つの整数をパラメーターとして取る ctor があることがわかります。私、本、または例に何か問題があります。それは何ですか?;)

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[])

4

2 に答える 2

1

巻末には、.NETCLR4.0を対象としていると書かれています。ただし、序文の「サンプルコード」セクションには、すべてのコードがC#および.NET2.0を使用して記述されていると記載されています。.NET4.0の最後に章があります。

上記のコマンドの出力は!dumpmt、エントリ列がポインタであるため、明らかに32ビット(x86)です。

2番目の質問です。参照している例を指定してください。

于 2013-02-14T04:36:50.350 に答える
1

X86 アセンブリをビルドするには、ビルド XML を変更できます。提供された XML は、アセンブリを 64 ビット ウィンドウで X64 としてビルドするようです。

于 2014-01-12T05:52:02.370 に答える