在带有SOS的WinDbg中查找静态字段的地址

Egl*_*lin 3 .net static windbg sos memory-address

我无法弄清楚如何使用带有SOS的WinDBG来获取静态.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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以使用!name2ee找到EEClass,我可以使用!dumpclass w/name2ee值查看值.

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
Run Code Online (Sandbox Code Playgroud)

但我似乎无法弄清楚如何获得该值实际存储的地址.一般来说,这是怎么做到的?

谢谢,埃格林

Ste*_*son 5

SOS不显示该字段的地址.请改用!sosex.mdt.!sosex.mdt windbg_static_test.StaticTest.

  • 它比这复杂得多,并且它对于运行时的每个主要版本都是不同的.静态存储在每个域或每个线程数组中.内存中有一个位置,它给出了域/线程静态开始的地址,然后是类中存储的偏移量.这是未记录的信息,因为我现在在MS工作,所以我不能在这里记录. (4认同)