【发布时间】:2019-01-07 16:15:13
【问题描述】:
最近,我尝试在内存地址上使用gdb 的watchpoint 功能调试内存损坏错误,该内存地址错误地被某些代码覆盖。
令人惊讶的是,这不起作用。我最终解决了我的问题,但没有gdb 的帮助。这是一个小代码示例,它演示了watchpoint 如何不触发:
void main() {
unsigned char data[] = {
0x12, 0x34, 0x56, 0x78
};
data[4] = 0x89;
}
此代码声明一个大小为 4 的数组并写入第 4 个索引。糟糕,我们损坏了一个字节的内存。
使用gdb,我在赋值执行前获取了data[4]的地址,并在地址上设置了watchpoint:
(gdb) p/x &data[4]
$1 = 0x7ffffffee950
(gdb) watch *0x7ffffffee950
Hardware watchpoint 2: *0x7ffffffee950
(gdb) continue
Continuing.
[Inferior 1 (process 14543) exited normally]
如您所见,应用程序正常运行并退出。 gdb 没有任何反应。这是一个错误还是我在这里做错了什么?如果地址被修改但没有任何反应,我希望从gdb 得到一些东西。
我的 gdb 版本是:
GNU gdb (Ubuntu 8.1-0ubuntu3)
【问题讨论】:
-
我在这里有点困惑。数组大小是 4。所以最后一个索引是 3。你想改变 data[3] 的值吗?
-
嗯,你为什么要在数组边界之外设置观察点?当您有此类请求时,我不确定
gdb的行为。而且,memcheck (valgrind) 可能对跟踪这种错误更有意义。 -
@perror 这是堆栈粉碎的部分。
-
你在未定义时有未定义的行为。是什么让你认为它会做那样的事情?
-
@BullyWiiPlaza 检查Valgrind says about that 的内容。请参阅 - TESTED 代码。
标签: c linux ubuntu gdb windows-subsystem-for-linux