我试图让GDB在变量更改时打印其值。
给出一个示例程序,当它更改时,我想在x
中获取func
的值,但要使该程序继续运行而没有提示:
#include <stdio.h>
#include <stdlib.h>
int func(int x, int y);
int main(void) {
int x = 5;
int y;
y = func(x, 4);
printf("%d\n", x);
printf("%d\n", y);
return EXIT_SUCCESS;
}
int func(int x, int y) {
y *= 2;
x += y;
return x;
}
我尝试过的事情:
break func
commands
silent
watch x
commands
continue
end
continue
end
虽然这将在更改时成功获取x
的值,但问题在于,当离开x
的范围时,gdb会停止通知我它将离开{{ 1}},并且它正在删除监视点。有什么方法可以将GDB设置为继续并继续执行,而无需在自动删除观察点时出现用户提示?
我遇到了一个问题:gdb: do not break when watchpoint on local variable goes out of scope 但是它从未收到解决方案。
答案 0 :(得分:1)
您可以为gdb的watch
命令提供-l
选项,并且当变量超出范围时,监视点将不会被删除(不会停止执行)。
但是,使用这种类型的观察点,gdb将拾取其他函数对堆栈上相同地址所做的更改。因此,您可以将限定if $_caller_is("func", 0)
添加到观察点,以便gdb仅在变量在func
内变化时通知您。
(gdb) list func 18 int func(int x, int y) { 19 y *= 2; 20 x += y; 21 return x; 22 } (gdb) b func Breakpoint 1 at 0x400580: file s2.c, line 19. (gdb) set $funcbp = $bpnum (gdb) commands Type commands for breakpoint(s) 1, one per line. End with a line saying just "end". ># We can only set a watchpoint on a local var ># when it's visible, so we'll set it on entry to func. ># But we don't want to set it more than once ># if func is called more than once, ># so we disable the func breakpoint on first use. >disable $funcbp >watch -l x if $_caller_is("func", 0) >commands >continue >end >continue >end (gdb) r Starting program: /home/mp/s2 Breakpoint 1, func (x=5, y=4) at s2.c:19 19 y *= 2; Hardware watchpoint 2: -location x Hardware watchpoint 2: -location x Old value = 5 New value = 13 func (x=13, y=8) at s2.c:21 21 return x; 5 13 [Inferior 1 (process 29495) exited normally]
答案 1 :(得分:0)
是否可以将GDB设置为继续执行并继续执行,而无需在自动删除观察点时出现用户提示?
否。
但是,您可以在返回时添加断点,并将命令附加到该断点以删除观察点并继续。这样就不会有GDB自动删除的活动监视点,因此当函数返回时它不会停止。