如何在运行时从Windbg扩展中的DMP文件获取类型信息?

时间:2010-04-06 21:22:31

标签: c++ object types windbg memory-dump

这与my previous question有关,关于从dmp文件中提取对象。

正如我在上一个问题中提到的,我可以通过创建包装器'remote'对象成功地将对象拉出dmp文件。到目前为止,我已经实现了其中的几个,它似乎运行良好。但是我遇到了障碍。

在一种情况下,指针存储在一个类中,比如'SomeBaseClass'类型,但该对象实际上是'SomeDerivedClass'类型,它派生自'SomeBaseClass'。例如,它将是这样的:

MyApplication!SomeObject
   +0x000 field1            : Ptr32 SomeBaseClass
   +0x004 field2            : Ptr32 SomeOtherClass
   +0x008 field3            : Ptr32 SomeOtherClass

我需要一些方法来找出ACTUAL类型的'field1'是什么。

更具体地说,使用示例地址:

MyApplication!SomeObject
   +0x000 field1            : 0cae2e24 SomeBaseClass
   +0x004 field2            : 0x262c8d3c SomeOtherClass
   +0x008 field3            : 0x262c8d3c SomeOtherClass

0:000> dt SomeBaseClass 0cae2e24 
MyApplication!SomeBaseClass
   +0x000 __VFN_table : 0x02de89e4 
   +0x038 basefield1         : (null) 
   +0x03c basefield2        : 3

0:000> dt SomeDerivedClass 0cae2e24 
MyApplication!SomeDerivedClass
   +0x000 __VFN_table : 0x02de89e4 
   +0x038 basefield1        : (null) 
   +0x03c basefield2        : 3
   +0x040 derivedfield1     : 357
   +0x044 derivedfield2     : timecode_t

当我在WinDbg时,我可以这样做:

dt 0x02de89e4 

它将显示类型:

0:000> dt 0x02de89e4 
SomeDerivedClass::`vftable'
Symbol  not found.

但是我如何在扩展中获得它?我可以使用SearchMemory()来查找'SomeDerivedClass ::`vftable'吗?如果你关注我的其他问题,我需要这种类型的信息,所以我知道要创建什么类型的包装器远程类。我认为它可能最终成为某种case语句,我必须将字符串与类型匹配?我对此感到满意,但我仍然不知道在哪里可以获得代表所讨论对象类型的字符串(即上例中的SomeObject-> field1)。

1 个答案:

答案 0 :(得分:1)

DOH!它比我想象的要简单得多。虚函数表只是其他符号,所以我可以使用带有field1的vftable地址的GetSymbol()。然后简单地设置一个包含我期望的几种类型的case语句,并为该情境创建一个正确的语句。

例如:

char buffer[255];
ULONG64 displacement;
GetSymbol(0x02de89e4,buffer, &displacement);

dprintf("0x%08lx = %s\n", 0x02de89e4, buffer);

在WinDbg中运行扩展时,输出:

0x02de89e4 = MyApplication!SomeDerivedClass::`vftable'

简单。只需要解析那个缓冲区,我应该好好去...