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: