如何在CDB(WinDbg)中为变量地址加偏移设置数据断点
如何动态设置基于对象成员指针偏移的数据断点
class Test { public: Test() { std::cout << "ctor" << std::endl; ptr = new int(5); *(ptr + 1) = 42; }; ~Test() { std::cout << "dtor" << std::endl; }; int* ptr; }; void foo() { Test test; } int main() { foo(); return 0; }
在上述代码示例中,需要在ptr指向的地址偏移4字节的位置设置数据断点,以此检测堆损坏问题。
当在Test构造函数内中断后,尝试执行以下命令设置断点时失败:
0:000> ba w 4 (ptr + 4) Bp expression '(ptr + 4)' could not be resolved, adding deferred bp *** Bp expression '(ptr + 4)' contains symbols not qualified with module name
手动输入固定地址时命令可以正常工作,但由于需要将操作集成到脚本中,而ptr存储的地址每次运行都会变化,因此不能硬编码地址。
正确的命令语法
要动态计算目标地址并设置数据断点,需明确指定符号的上下文和所属模块,以下是几种可行的写法:
构造函数内使用
this指针(x86架构)
构造函数中断时,this指针存储在ecx寄存器(对应WinDbg中的@$crax),通过它访问ptr成员并计算偏移:ba w 4 (@$crax->ptr + 4)若为x64架构,
this指针在rcx寄存器,对应@$rcx:ba w 4 (@$rcx->ptr + 4)通过局部变量访问(若在
foo函数内中断)
当断点落在foo函数的Test test;之后,可直接通过局部变量符号访问:ba w 4 (test.ptr + 4)带模块限定的通用写法
为避免符号解析歧义,可加上模块名限定(假设程序模块名为test.exe):ba w 4 (@$rcx->test!Test::ptr + 4)
这些写法会动态计算每次运行时的目标地址,无需硬编码,适合集成到自动化脚本中。
内容的提问来源于stack exchange,提问作者Qutab Qazi
相关产品推荐
相关产品推荐

