4

我试图让 GDB 在变量更改时打印它的值。

给定一个示例程序,我想在它发生变化时获取xin的值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 将停止通知我它正在离开范围x并且正在删除观察点。有没有办法让 GDB 在自动删除观察点时继续执行而无需用户提示?

我遇到了这个问题:gdb:当局部变量上的观察点超出范围时不要中断 但是它从未收到解决方案。

4

2 回答 2

3

您可以为 gdb 的watch命令提供-l选项,当变量超出范围时,观察点不会被删除(也不会停止执行)。

但是使用这种类型的观察点,gdb 将获取其他函数对堆栈上同一地址所做的更改。因此,您可以将限定条件添加if $_caller_is("func", 0)到观察点,以便 gdb 仅在func.

(gdb)列表函数
18 int func(int x, int y) {
19 年 *= 2;
20 x += y;
21返回x;
22 }
(gdb) b 函数
0x400580 处的断点 1:文件 s2.c,第 19 行。
(gdb)设置 $funcbp = $bpnum 
(gdb)命令
为断点 1 键入命令,每行一个。
以一句“结束”结束。
> # 我们只能在本地变量上设置观察点
> # 当它可见时,我们将在进入 func 时设置它。
> # 但是我们不想设置不止一次
> # 如果 func 被多次调用, 
> # 所以我们在第一次使用时禁用 func 断点。
>禁用 $funcbp 
> watch -lx if $_caller_is("func", 0) 
> commands 
 > continue 
 > end 
> continue 
> end 
(gdb) r
启动程序:/home/mp/s2

断点 1,func (x=5, y=4) at s2.c:19
19 年 *= 2;
硬件观察点 2:-location x

硬件观察点 2:-location x

旧值 = 5
新值 = 13
函数 (x=13, y=8) 在 s2.c:21
21返回x;
5
13
【下1(进程29495)正常退出】
于 2018-11-07T16:38:23.133 回答
0

有没有办法让 GDB 在自动删除观察点时继续执行而无需用户提示?

不。

但是,您可以在返回时添加断点,并将命令附加到该断点以删除观察点并继续。然后 GDB 将不会有任何活动的观察点自动删除,因此当函数返回时它不会停止。

于 2018-11-07T06:58:37.403 回答