Jaa


The Root of .NET Framework に関する補足

読まれた方からの質問で、3章のP79でECXレジスタとダンプヒープの関係が良くわからないという質問を頂きました。原稿をチェックしていて、少し書き漏れているなぁと思ったので補足します。

最初にブレークポイントの話です。

  • 書籍では「 B b1 = new B();」で停止したら、ステップ実行しますと記載しています。
  • つまり、インスタンス フィールドで実行が停止した状態を指しますが、この説明が不足していました。
  • クラスBの初期化中に実行が停止しており、クラスの初期化コード(コンストラクタ)で停止しているのがポイントになります。

この状態で、[デバッグ]-[ウィンドウ]-[レジスタ]でレジスタウィドウを表示します。

  • 注目すべきは、ECXレジスタの値です。
  • この理由は、クラス内のコードが実行されている場合にECXレジスタにthisポインタが格納されているからです。

イミディエイト ウィンドウでSOSデバッガ拡張をロードし、「!DumpHeap -Type B」コマンドでマネージヒープを確認します。

  • Statisticsから、クラスBのメソッドテーブルのアドレスとサイズを確認します。
  • オブジェクトのダンプリストから、確認したメソッドテーブルのアドレスが一致するオブジェクトを見つけます。
  • 見つけたオブジェクトのサイズも控えたサイズになっているのを確認できます。
  • 見つけたオブジェクトのアドレスとECXレジスタのアドレスを較べれば、同じであることを確認できます。
    この作業で、ECXレジスタにthisポインタが格納されていることを確認したことになります。
    実際には、DumpHeapコマンドは膨大な情報が出力されますが、書籍ではポイントだけに絞ってあります。

書籍では、画面のハードコピーがありますが、紙面との関係でインスタンス フィールドで停止している様子を載せることができませんでした。このために、少し分かり難かったかも知れません。

#P79-80では、thisポインタがECXレジスタに格納されているというのを確認することを目的としていました。

追記:P79の下から2行目にあるリスト3-8は間違いで、正しくは以下のようになります。
誤:リスト3-8「ILAsmのアセンブリ参照」
正:リスト3-11「!DumpHeap -Typ B」
この誤植は、原稿時点ではリスト番号しか無かったのですが、校正時にリスト番号の付け直しとリスト名を付与していまして、私の見落としでございます。ご指摘いただきまして、有難うございました。