【发布时间】:2014-07-22 06:49:01
【问题描述】:
在 Visual Studio 中调试 C++ 项目时, 一些数据断点从未命中。
所以我写了一些代码进行测试:
#include <iostream>
#include <stdint.h>
void test(uint32_t* p)
{
*p = 0;
// set a data breakpoint on p
*((char*)p + 2) = 0x1;
std::cout << *p << std::endl;
}
uint32_t* alloc(size_t offset)
{
char* p = new char[sizeof(uint32_t) + offset];
p = p + offset;
return (uint32_t*)p;
}
int main()
{
test(alloc(0)); // test #1
test(alloc(2)); // test #2
}
如您所见,在函数测试中,*p 的值将首先归零, 那么它将被隐式更改,我有一个小端CPU,所以它 必须是 65536。
如果在 p(4 字节)上设置数据断点来检测变化, 你会得到两种不同的结果:命中与否。这取决于 p 指向的地址。
在我上面的测试代码中,测试#1 会命中,而测试#2 不会, #1 和 #2 之间的区别是返回的地址 alloc(0) 和 alloc(2)。
MSDN上的这篇文章How to: Set a Data Breakpoint不讲这个。
数据断点在未对齐的地址上不起作用吗?
【问题讨论】:
标签: c++ debugging visual-c++ breakpoints