我正试图让GDB在变量更改时打印变量的值。
给定一个示例程序,我想在func
中获得x
的值,但程序在没有提示的情况下继续:
#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("%dn", x);
printf("%dn", 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会停下来通知我它正在离开x
的范围,并且它正在删除观察点。有没有任何方法可以设置GDB在自动删除观察点时在没有用户提示的情况下继续执行?
我遇到了这样一个问题:gdb:当局部变量的观察点超出范围时不要中断然而,它从未得到解决方案。
您可以为gdb的watch
命令提供-l
选项,当变量超出范围时,观察点不会被删除(也不会停止执行(。
但是有了这种类型的观察点,gdb将获取其他函数对堆栈上相同地址所做的更改。因此,您可以将限定if $_caller_is("func", 0)
添加到观察点,这样gdb只会在func
中的变量发生更改时通知您。
(gdb(列表函数18 int函数(int x,int y({19 y*=2;20 x+=y;21返回x;22}(gdb(b函数0x400580处的断点1:文件s2.c,第19行。(gdb(set$funcbp=$bpnum(gdb或命令为断点1键入命令,每行一个。以一句"结束"结束。>#当局部var#可见时,我们只能在它上设置一个观察点,所以我们将在进入func时设置它>#但我们不想设置多次#如果func被调用多次,>>#所以我们在第一次使用时禁用func断点>禁用$funcbpwatch-l x if$_caller_is("func",0(>命令>continueend>>end(gdb(r启动程序:/home/mp/s2断点1,函数(x=5,y=4(在s2。c:1919 y*=2;硬件观察点2:-位置x硬件观察点2:-位置x旧值=5新值=13函数(x=13,y=8(在s2。c:2121返回x;5.13【劣1(进程29495(正常退出】
在自动删除观察点时,有没有任何方法可以将GDB设置为在没有用户提示的情况下继续执行?
否。
但是,您可以在返回时添加断点,并将命令附加到该断点以删除观察点并继续。然后,GDB将不会有任何活动的观察点来自动删除,因此当函数返回时,它不会停止。