1

这与我之前的问题有关,关于从 dmp 文件中提取对象。

正如我在上一个问题中提到的,我可以通过创建包装“远程”对象成功地将对象从 dmp 文件中提取出来。到目前为止,我已经实现了其中的几个,并且似乎运行良好。但是,我遇到了障碍。

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

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

我需要一些方法来找出“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”吗?如果您关注我的其他问题,我需要此类型信息,以便知道要创建哪种类型的包装器远程类。我认为它可能最终成为某种案例陈述,我必须将字符串与类型匹配?我对此表示同意,但我仍然不知道在哪里可以得到代表相关对象类型的字符串(即上面示例中的 SomeObject->field1)。

4

1 回答 1

1

哦!这比我想象的要简单得多。虚函数表只是其他符号,因此我可以将 GetSymbol() 与 field1 的 vftable 的地址一起使用。然后简单地用我期望的几种类型设置一个 case 语句,并为这种情况创建正确的语句。

例如:

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

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

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

0x02de89e4 = MyApplication!SomeDerivedClass::`vftable'

简单的。只需要解析那个缓冲区,我应该很高兴......

于 2010-04-07T01:40:36.727 回答