1
#include <stdio.h>

typedef struct ThingStruct {
    int arr[8];
    int after;
} Thing;

void foo(int i) {
    Thing thing;
    int* ip = &thing.after;
    thing.after = 12345;
    printf("beforehand\n");
    thing.arr[i] = 55;
    printf("done\n");
}

int main() {
    foo(8);
}

此代码thing.after因意外超出数组末尾而发生更改。我想尝试thing.after使用 gdb 找到发生变化的行。所以我用 -g 编译,在第 12 行放一个断点,然后放一个观察点 on thing.after,但是观察点没有触发,即使在第 14 行放一个断点确实表明thing.after确实发生了变化。

我什至尝试获取地址thing.after并在其上设置观察点,但它仍然没有触发。

4

2 回答 2

2

每次进入函数时都需要重新添加观察点foo(注意,由于是观察局部变量,栈帧退出后无效,foo返回后自动删除)。此外,如果监视变量在要执行的当前行发生更改,则监视点不会被触发(不知道为什么)。watch thing.after对我来说,当我在在线输入 foo 后添加观察点时它可以工作int* ip = &thing.after;。当我继续时,观察点命中 2 次。

于 2015-11-07T04:24:05.750 回答
1

你没有说哪个平台,什么版本的 GDB,或者你用什么命令来设置观察点。

在 Ubuntu/x86_64 上使用 gdb 7.9,一切都按照我的预期工作:

(gdb) b foo
Breakpoint 1 at 0x400538: file t.c, line 10.
(gdb) r
Starting program: /tmp/a.out 

Breakpoint 1, foo (i=8) at t.c:10
10          int* ip = &thing.after;
(gdb) watch thing.after
Hardware watchpoint 2: thing.after
(gdb) c
Continuing.
Hardware watchpoint 2: thing.after

Old value = 4195712
New value = 12345
foo (i=8) at t.c:12
12          printf("beforehand\n");
(gdb) c
Continuing.
beforehand
Hardware watchpoint 2: thing.after

Old value = 12345
New value = 55
foo (i=8) at t.c:14
14          printf("done\n");

(gdb) q

于 2015-11-07T04:50:42.283 回答