gdb观察点赢得';当变量从数组的末尾更改时,将无法工作 #包括 typedef结构ThingStruct{ int-arr[8]; int之后; }事物; 空富(内部一){ 事物; int*ip=&thing.after; thing.after=12345; printf(“预先\n”); 事物arr[i]=55; printf(“完成”\n); } int main(){ 傅(8),; }

gdb观察点赢得';当变量从数组的末尾更改时,将无法工作 #包括 typedef结构ThingStruct{ int-arr[8]; int之后; }事物; 空富(内部一){ 事物; int*ip=&thing.after; thing.after=12345; printf(“预先\n”); 事物arr[i]=55; printf(“完成”\n); } int main(){ 傅(8),; },c,gdb,watch,watchpoint,C,Gdb,Watch,Watchpoint,此代码在之后通过意外离开数组末端而更改。我想试着用gdb找到wherething.after正在改变的行。所以我用-g编译,在第12行放一个断点,然后在东西上放一个观察点。在之后,但观察点不会触发,即使在第14行放一个断点确实表明东西。在之后确实发生了变化 我甚至试着记下东西的地址。在之后设置一个观察点,但它仍然不会触发。每次输入foo函数时都需要重新添加观察点(请注意,当您观察局部变量时,它在堆栈帧退出后将无效,并在foo返回后自动删除)。此外,如果观察的变量在要执行的当前行上发生更改,则观察

此代码在之后通过意外离开数组末端而更改。我想试着用gdb找到where
thing.after
正在改变的行。所以我用-g编译,在第12行放一个断点,然后在
东西上放一个观察点。在
之后,但观察点不会触发,即使在第14行放一个断点确实表明
东西。在
之后确实发生了变化


我甚至试着记下
东西的地址。在
之后设置一个观察点,但它仍然不会触发。

每次输入
foo
函数时都需要重新添加观察点(请注意,当您观察局部变量时,它在堆栈帧退出后将无效,并在
foo
返回后自动删除)。此外,如果观察的变量在要执行的当前行上发生更改,则观察点不会被触发(不确定原因)。对我来说,当我添加监视点
监视对象时,它会工作。
之后,当我在线
int*ip=&thing.after;
。当我继续时,监视点会命中2次。

你没有说是哪个平台、哪个版本的GDB,或者你使用了什么命令来设置监视点

在Ubuntu/x86_64上使用gdb 7.9,事情按照我预期的方式运行:

#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);
}

(gdb)q

foo
在这个测试中只调用了一次。好吧,这是两个问题,没有在下一行触发,而且在一个更大的程序中,它将-g标签偏移1或2行,这让我困惑地认为观察点根本没有触发。
(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");