使用WinDbg查看非当前线程所在模块的内存数据信息

在工作中经常需要查看dump,虽然现在VC2015已经做的非常好了,尤其是对map的解析,非常方便,而且enum可以直接显示定义字符串。但windbg却有一些vc没有提供的功能(可能我没有发现~~),比如查看非当前线程所在模块的内存数据信息。下面对此方法做一下说明,以备遇到此问题的同学快速查阅。

材料:dt dll名字 结构体名字 mem地址。

其实挺简单。只要使用dt命令就行。

格式: dt dll_name!struct_name mem_addr

即 dt dll名字(不能带后缀名)! 结构体名字 内存地址

截图举例

   dt NXDecoder!Classname 000000011fc44e30
   +0x000 __VFN_table : 0x000007fe`e90e9228 
   +0x008 m_p    : 0x00000001`1fdcbf50 
   +0x010 m_stParam : tag_NXParam
   +0x028 m_stGroup : std::vector >
   +0x058 .....

由于某种原因,将上面的dt内容做了整形,有点面目全非,但基本能看出来。

这个是要通过一个类指针解析类的内容。000000011fc44e30 -- 类指针地址。

由于这个类是几个继承的子类,因此在指针内存0偏移处是一个虚表,可以忽略,其实是父类指针。

   +0x028 m_stGroup : std::vector >

这个是我们要解析的重点,可以看到是一个vector,vector的内存地址是 000000011fc44e30 +0x028


--------------------------------------------------------------------------------------------------------------------------

于是我们接着解析这个vector。

dt NXDecoder!NXtemGroup 11FC44E58
   +0x000 _Myownedaux      : 0x00000000`336882f0 std::_Aux_cont
   +0x008 _Alaux           : std::allocator
   +0x010 _Alval           : std::allocator
   +0x018 _Myfirst         : 0x00000002`15edf680  -> 0x00000002`153e7a40 CNXPixelItem 
   +0x020 _Mylast          : 0x00000002`15edf708  -> 0x00000002`157e3c60 CNXPixelItem 
   +0x028 _Myend           : 0x00000002`15edf878  -> 0x80000062`386b5530 CNXPixelItem 

可以看到这个vector的元素是指针,64位程序一个指针8字节,这样,这个vector就有(0x00000002`15edf708 - 0x00000002`15edf680) / 8 + 1 = 12个元素,这里是闭区间。

0x00000002`153e7a40 -- vector中第一个元素的值,是一个指针值。

记得遍历vector元素时,要偏移0x00000002`15edf680。

----------------------------------------------------------------------------------------------------------------

可以按照上面的方法继续遍历你想要知道的结构体数据信息。


你可能感兴趣的:(编程)