在工作中经常需要查看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。
----------------------------------------------------------------------------------------------------------------
可以按照上面的方法继续遍历你想要知道的结构体数据信息。
本文介绍了如何使用 Windbg 工具查看非当前线程所在模块的内存数据信息,特别是通过 `dt` 命令解析结构体内容。举例展示了通过类指针解析类成员,如解析 std::vector 的详细步骤,帮助读者理解并掌握这一实用技巧。
1万+

被折叠的 条评论
为什么被折叠?



