Windbg调试疑问:如何通过this指针查看类成员及stl::vector大小
嘿,我来帮你搞定这两个WinDbg调试的问题!之前调试的时候我也踩过类似的坑,dv命令有时候确实不太够用,下面给你具体的解决步骤:
一、通过this指针查看类成员变量m_pool
dv命令主要用来显示当前栈帧的局部变量,当涉及到类成员(尤其是非栈上的对象)或者编译器开启了优化时,它就容易失效。这时候**dt命令**才是正确的选择,具体操作分两种情况:
1. 知道类的完整名称(包括命名空间)
假设你的类是MyClass,当前this指针的值是0x12345678(或者在成员函数栈帧里直接用this变量),直接执行:
dt MyClass 0x12345678
或者如果是在成员函数中,直接用:
dt MyClass this
命令执行后,WinDbg会列出该类的所有成员变量,你直接找到m_pool即可。如果类在命名空间里,记得加上命名空间前缀,比如:
dt MyNamespace::MyClass this
2. 不知道类的名称
如果不确定类的具体名称,可以先通过this指针查看对象的类型:
dt poi(this)
这条命令会自动解析this指向的对象类型,然后你再用解析出的类名配合dt命令查看成员。
二、查看std::vector的大小
std::vector的内部结构在MSVC编译器下通常包含三个核心指针:_Myfirst(指向容器起始)、_Mylast(指向最后一个元素的下一个位置)、_Myend(指向容器内存的末尾),大小就是_Mylast - _Myfirst。这里有两种简单的方法:
1. 用dt命令计算大小
假设vector的地址是0xabcdef00,类型是std::vector<int>,先查看它的成员:
dt std::vector<int> 0xabcdef00
找到_Myfirst和_Mylast的偏移后,直接计算差值:
? poi(0xabcdef00 + offsetof(std::vector<int>, _Mylast)) - poi(0xabcdef00 + offsetof(std::vector<int>, _Myfirst))
注:不同版本的MSVC可能成员名称略有不同,比如有些版本是_Begin、_End,但逻辑是一样的。
2. 用dx命令直接获取size(更推荐)
WinDbg的dx命令对STL容器的支持非常友好,只要有正确的符号,直接调用容器的size()方法就行:
dx ((std::vector<int>*)0xabcdef00)->size()
如果是在当前栈帧里的vector局部变量,直接用变量名:
dx myVector.size()
这条命令会直接返回vector的当前大小,比计算指针差值更直观。
为什么dv命令不起作用?
dv命令的设计目标是显示当前栈帧的局部变量和参数,对于类的成员变量(尤其是存在于堆上的对象),它无法直接解析;另外如果编译器开启了优化(比如Release模式),类成员的符号信息可能被精简,dv就更找不到了。这时候用dt或者dx命令才是更可靠的方案。
内容的提问来源于stack exchange,提问作者Alfred

