3

WinDBG w/SOS を使用して静的 .NET クラス メンバーのアドレスにアクセスする方法がわかりません。次のような入力プログラムがあるとします。

namespace windg_static_test
{
    class StaticTest
    {
        public static bool static_bool_field = true;
        public void show_and_set()
        {
            while (static_bool_field)
            {
                Console.WriteLine("static_bool_field = " + static_bool_field + "\nEnter new value: ");
                static_bool_field = Console.ReadLine()[0] == '0' ? false : true;
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            StaticTest st = new StaticTest();
            st.show_and_set();
        }
    }
}

!name2ee を使用して EEClass を見つけることができ、name2ee 値を使用して !dumpclass を使用して値を表示できます。

0:004> !dumpclass 1c12e0
Class Name:      windg_static_test.StaticTest
mdToken:         02000002
File:            C:\Develop\Projects\windg static test\bin\Release\windg static test.exe
Parent Class:    64f84920
Module:          001c2e94
Method Table:    001c3844
Vtable Slots:    4
Total Method Slots:  6
Class Attributes:    100000  
Transparency:        Critical
NumInstanceFields:   0
NumStaticFields:     1
      MT    Field   Offset                 Type VT     Attr    Value Name
65377208  4000001       1f       System.Boolean  1   static        1 static_bool_field

しかし、値が実際に格納されているアドレスを取得する方法がわかりません。一般的に、これはどのように行われますか?

ありがとう、エグリン

4

3 に答える 3

5

SOS はフィールドのアドレスを表示しません。代わりに !sosex.mdt を使用してください。!sosex.mdt windbg_static_test.StaticTest.

于 2012-10-22T18:29:25.237 に答える
1

SOS は、参照型オブジェクトの場合にのみアドレスを表示します。int,bool の場合、値型であるため値を直接表示します

于 2012-10-23T06:41:52.773 に答える
0

逆アセンブリを調べてみると、静的な値が .data セグメントから取得されていることがわかりました。!dumpclass/!dumpobj が値型に対して提供するオフセットから正しい場所を取得するための汎用ソリューションを策定する方法を理解できませんでしたが、静的参照型メンバーのインデックスは正常に機能しますベースポインタを見つけたら、ヒープします。情報が .data セグメントにどのように格納されているかについてより良い情報を得るには、PE 形式の詳細を掘り下げる必要があると思いますが、どこから始めればよいのか、現時点で追求する価値があるのか​​どうかは正確にはわかりません。 .

助けてくれてありがとう、みんな。

于 2012-10-24T01:47:30.960 に答える