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

本文介绍了如何使用 Windbg 工具查看非当前线程所在模块的内存数据信息,特别是通过 `dt` 命令解析结构体内容。举例展示了通过类指针解析类成员,如解析 std::vector 的详细步骤,帮助读者理解并掌握这一实用技巧。

在工作中经常需要查看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<CNXItem *,std::allocator<CNXPixelItem *> >
   +0x058 .....

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

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

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

   +0x028 m_stGroup : std::vector<CNXItem *,std::allocator<CNXPixelItem *> >

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


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

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

dt NXDecoder!NXtemGroup 11FC44E58
   +0x000 _Myownedaux      : 0x00000000`336882f0 std::_Aux_cont
   +0x008 _Alaux           : std::allocator<std::_Aux_cont>
   +0x010 _Alval           : std::allocator<CNXPixelItem *>
   +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。

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值