3

我无法弄清楚如何使用带 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();
        }
    }
}

我可以使用 !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 为您提供的值类型的偏移量中获取正确的位置,但索引对于静态引用类型成员确实可以正常工作找出基指针后堆。我猜我必须深入研究 PE 格式的细节,才能更好地了解信息是如何存储在 .data 段中的,尽管我不确定从哪里开始,或者此时是否值得追求.

谢谢大家的帮助。

于 2012-10-24T01:47:30.960 回答