Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在运行时从Windbg扩展名中的DMP文件中获取类型信息?_C++_Object_Types_Windbg_Memory Dump - Fatal编程技术网

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

C++ 如何在运行时从Windbg扩展名中的DMP文件中获取类型信息?,c++,object,types,windbg,memory-dump,C++,Object,Types,Windbg,Memory Dump,这与从dmp文件中提取对象有关 正如我在前面的问题中提到的,通过创建包装器“远程”对象,我可以成功地将对象从dmp文件中拉出。到目前为止,我已经实现了其中的几个,而且似乎工作得很好。然而,我遇到了一个障碍 在一种情况下,指针存储在一个类中,比如“SomeBaseClass”类型,但该对象实际上是从“SomeBaseClass”派生的“SomeDerivedClass”类型。例如,它可能是这样的: MyApplication!SomeObject +0x000 field1

这与从dmp文件中提取对象有关

正如我在前面的问题中提到的,通过创建包装器“远程”对象,我可以成功地将对象从dmp文件中拉出。到目前为止,我已经实现了其中的几个,而且似乎工作得很好。然而,我遇到了一个障碍

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

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'吗?如果您遵循我的另一个问题,我需要这个类型信息,以便知道要创建哪种类型的包装器远程类。我想它可能会变成某种case语句,在这里我必须将字符串与类型匹配?我对此没有意见,但我仍然不知道从哪里可以得到表示所讨论对象类型的字符串(即上面示例中的SomeObject->field1)。

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

例如:

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

dprintf("0x%08lx = %s\n", 0x02de89e4, buffer);
在WinDbg中,当我运行扩展时,此输出:

0x02de89e4 = MyApplication!SomeDerivedClass::`vftable'

简单。只要解析缓冲区,我就可以开始了…

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

例如:

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

dprintf("0x%08lx = %s\n", 0x02de89e4, buffer);
在WinDbg中,当我运行扩展时,此输出:

0x02de89e4 = MyApplication!SomeDerivedClass::`vftable'

简单。只要解析缓冲区,我就可以开始了…

问得好,回答得好!很好的问题和答案!