如何在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个字节(设置一个数据断点,以检测堆损坏。

在测试构造函数内部中断后,我尝试使用以下方法设置断点,但失败了:

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中的地址每次都可能更改。

在不硬编码地址的情况下添加数据断点的正确语法是什么?

您需要@@c++().expr /s c++:

0:000> bp MemoryBreak!Test::Test
0:000> g
Breakpoint 2 hit
MemoryBreak!Test::Test:
[...]
0:000> l+t
Source options are 1:
1/t - Step/trace by source line
0:000> p
MemoryBreak!Test::Test+0x42:
0:000> ? @@c++(ptr)
Evaluate expression: 2790386541360 = 00000289`afffa330
0:000> ba w 4 @@c++(ptr)+4
0:000> bl
1 e Disable Clear  00007ff7`5fac2720  [C:....cpp @ 23]  0001 (0001)  0:**** MemoryBreak!main
2 e Disable Clear  00007ff7`5fac1fa0  [C:....cpp @ 6]  0001 (0001)  0:**** MemoryBreak!Test::Test
3 e Disable Clear  00000289`afffa334 w 4 0001 (0001)  0:**** 
0:000> g
Breakpoint 3 hit
MemoryBreak!Test::Test+0xa7:

相关内容

  • 没有找到相关文章

最新更新