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找到wheregdb观察点赢得';当变量从数组的末尾更改时,将无法工作 #包括 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返回后自动删除)。此外,如果观察的变量在要执行的当前行上发生更改,则观察
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)qfoo
在这个测试中只调用了一次。好吧,这是两个问题,没有在下一行触发,而且在一个更大的程序中,它将-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");