.net 查找WinDbg中带SOS的静态字段的地址

.net 查找WinDbg中带SOS的静态字段的地址,.net,static,windbg,memory-address,sos,.net,Static,Windbg,Memory Address,Sos,我很难弄清楚如何使用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)

我很难弄清楚如何使用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();
        }
    }
}
我可以找到EEClass使用!name2ee,我可以使用!带有名称2ee值的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
但我似乎不知道如何获取值实际存储的地址。一般来说,这是如何做到的

谢谢,
Eglin不显示字段的地址。使用!而不是sosex.mdt。
!sosex.mdt windbg_static_test.StaticTest.

SOS仅当地址是引用类型对象时才显示地址。对于int,bool它直接显示值,因为它们是值类型

拨动反汇编可以让我看到从.data段提取的静态值。我无法想出如何制定一个通用解决方案,从偏移量中获得正确的位置!dumpclass/!dumpobj为您提供了值类型的索引,但是一旦您找到了基指针,索引对于堆上的静态引用类型成员就可以很好地工作。我猜我必须深入研究PE格式的细节,以便更好地了解信息是如何存储在.data段中的,尽管我不确定从何处开始,也不确定此时是否值得研究


谢谢大家的帮助。

您正在调试哪个版本的.NET?哦,天哪!很抱歉,我努力想提出一个完整的问题,但失败了。我在Win 7 x64上使用4.5,为“任何CPU”编译,并使用32位版本的WinDbg。我相信您的扩展非常棒,但如果存在这样的问题,我更希望得到一个答案,如“查看eeclass的偏移量7c”。如何在WinDBG扩展中找到地址?它比这个复杂得多,并且对于运行时的每个主要版本都是不同的。静态数据存储在每个域或每个线程的数组中。内存中有一个位置,它给出域/线程的静态开始地址,然后是类中存储的偏移量。这是未记录的信息,因为我现在为MS工作,所以不能在这里记录。此外,这取决于类是否共享,以及它是否是动态类。我需要大量的代码审查才能记住算法。我知道对于静态值类型和静态实例类型,“内存中有一个位置给出了静态开始的地址”——具体来说,我的问题是如何确定地址。如果你不知道答案或者出于任何原因不愿意投稿,为什么还要发帖呢?