2015-11-07 59 views
0
#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。我想尝试通过使用gdb找到thing.after正在更改的行。因此,我使用-g编译,在第12行放置了一个断点,然后在thing.after上放置了一个观察点,但即使在第14行放置断点,观察点也不会触发,但确实thing.after确实发生了变化。当变量从数组末端变化时,gdb观察点将不起作用

我甚至尝试了thing.after的地址,并设置了一个观察点,但它仍然没有触发。

回答

2

每次输入foo函数时都需要重新添加观察点(请注意,当您正在监视本地变量时,在堆栈帧退出后它将无效并在foo返回后自动删除)。另外,如果观察变量在当前要执行的行上发生变化,那么观察点不会被触发(不知道为什么)。对于我来说,当我在线int* ip = &thing.after;上输入foo后立即添加观察点watch thing.after时,它就可以工作。当我继续时,手表点击两次。

+1

'foo'仅在本次测试调用一次。 –

+0

好的,这是2个问题,在下一行没有触发,而且在一个更大的程序中,它将-g标签1或2行偏移,这让我感到困惑,认为观察点根本没有触发。 – Buge

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)问