首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在内存地址上未触发gdb观察点

在内存地址上未触发gdb观察点
EN

Stack Overflow用户
提问于 2018-07-31 17:48:52
回答 1查看 1.3K关注 0票数 1

最近,我试图使用gdbwatchpoint功能来调试一个内存损坏的bug,这个内存地址被一些代码错误地覆盖了。

令人惊讶的是,这并不起作用。我最终解决了我的问题,但没有gdb的帮助。下面是一个小代码示例,演示了watchpoint是如何不触发的:

代码语言:javascript
复制
void main() {
    unsigned char data[] = {
        0x12, 0x34, 0x56, 0x78
    };

    data[4] = 0x89;
}

这段代码声明了一个大小为4的数组,并写入第四个索引。哦,我们损坏了一个字节的内存。

使用gdb,我在执行赋值之前获取了data[4]的地址,并在该地址上设置了一个watchpoint

代码语言:javascript
复制
(gdb) p/x &data[4]
$1 = 0x7ffffffee950
(gdb) watch *0x7ffffffee950
Hardware watchpoint 2: *0x7ffffffee950
(gdb) continue
Continuing.
[Inferior 1 (process 14543) exited normally]

如您所见,应用程序继续正常运行并退出。gdb没有反应。这是一个bug,还是我做错了什么?如果地址被修改了,但什么也没发生,我希望从gdb得到一些东西。

我的gdb版本是:

代码语言:javascript
复制
GNU gdb (Ubuntu 8.1-0ubuntu3)
EN

回答 1

Stack Overflow用户

发布于 2018-07-31 18:19:51

奇怪的是,这似乎与您的示例位于main()函数中这一事实有关。我尝试了下面的例子:

代码语言:javascript
复制
void foo() {
    unsigned char data[] = {
        0x12, 0x34, 0x56, 0x78
    };
    data[4] = 0x89;
}

void main() {
  foo();
}

我编译了它,并在上面运行了gdb

代码语言:javascript
复制
$> gcc -g3 -fno-stack-protector -o sample sample.c
$> gdb -q ./sample
Reading symbols from ./sample...done.
(gdb) b foo
Breakpoint 1 at 0x1129: file sample.c, line 2.
(gdb) r
Starting program: /tmp/sample 

Breakpoint 1, foo () at sample.c:2
2       unsigned char data[] = {
(gdb) p /x &data[4]
$1 = 0x7fffffffe150
(gdb) watch *0x7fffffffe150
Hardware watchpoint 2: *0x7fffffffe150
(gdb) c
Continuing.

Hardware watchpoint 2: *0x7fffffffe150

Old value = -7840
New value = -7799
foo () at sample.c:7
7   

因此,它在foo()中似乎工作得很好(但是,我也可以说它在main()中不能工作)。我来看看为什么.

编辑

似乎我遇到了一个小故障(或者我做了一些不同的事情,但我不记得是什么了)。它在我的系统上工作得很好(Debian不稳定,GDB8.1)。下面是我使用的代码:

代码语言:javascript
复制
void main() {
    unsigned char data[] = {
        0x12, 0x34, 0x56, 0x78
    };
    data[4] = 0x89;
}

在上面编译并运行gdb

代码语言:javascript
复制
$> gcc -Wall -Wextra -fno-stack-protector -g3 -o sample sample.c
$> gdb -q ./sample
Reading symbols from ./sample...done.
(gdb) start
Temporary breakpoint 1 at 0x1129: file sample.c, line 2.
Starting program: /tmp/sample 

Temporary breakpoint 1, main () at sample.c:2
2       unsigned char data[] = {
(gdb) p /x &data[4]
$1 = 0x7fffffffe160
(gdb) watch *0x7fffffffe160
Hardware watchpoint 2: *0x7fffffffe160
(gdb) c
Continuing.

Hardware watchpoint 2: *0x7fffffffe160

Old value = 1431654720
New value = 1431654793
main () at sample.c:6
6   }

没什么奇怪的..。观察点的工作情况与预期一致。但是,这很奇怪,因为它一开始并不起作用。我可能做了一些稍微不同的..。也许,我确实在启动程序之前设置了观察点。它可能会在这件事中扮演一些角色。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51610452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档