【问题标题】:Find address of static field in WinDbg w/ SOS在带 SOS 的 WinDbg 中查找静态字段的地址
【发布时间】:2012-10-22 17:25:38
【问题描述】:

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

但我似乎无法弄清楚如何获取该值实际存储的地址。一般来说,这是如何完成的?

谢谢, 埃格林

【问题讨论】:

  • 你在调试什么版本的 .NET?
  • 哦,天哪!对不起 - 我非常努力地提出一个完整的问题,但失败了。我在 Win 7 x64 上使用 4.5,为“任何 CPU”编译,并使用 32 位版本的 WinDbg。

标签: .net static windbg memory-address sos


【解决方案1】:

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

【讨论】:

  • 我相信你的扩展很棒,但如果存在这样的事情,我更喜欢“看看 eeclass 的偏移量 7c”之类的答案。如何在 WinDBG 扩展中找到地址?
  • 它比这复杂得多,并且对于每个主要版本的运行时都不同。静态数据存储在每个域或每个线程的数组中。内存中有一个位置给出域/线程的静态开始地址,然后是存储在类中的偏移量。这是未记录的信息,由于我现在为 MS 工作,因此无法在此处记录。
  • 另外,这取决于一个类是否共享,以及它是否是一个动态类。我需要大量的代码审查才能记住算法。
  • 我知道“内存中有一个位置给出了静态值的起始地址”,用于静态值类型,另一个用于静态实例类型 - 我的问题,特别是询问如何确定地址。如果您不知道答案或出于某种原因不愿意贡献,那何必费心发帖呢?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    查看反汇编让我看到了从 .data 段中获取的静态值。我无法弄清楚如何制定通用解决方案以从 !dumpclass/!dumpobj 为您提供的值类型的偏移量中获取正确的位置,但索引对于静态引用类型成员确实可以正常工作找出基指针后堆。我猜我必须深入研究 PE 格式的细节,才能更好地了解信息是如何存储在 .data 段中的,尽管我不确定从哪里开始,或者此时是否值得追求.

    谢谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 2014-01-06
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      相关资源
      最近更新 更多