在不停止执行的情况下观察 gdb 中的局部变量

Watching local variables in gdb without stopping execution

我试图让 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("%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的范围x 并且正在删除观察点。是否有任何方法可以将 GDB 设置为在自动删除观察点时在没有用户提示的情况下继续执行?

我遇到了这个问题:gdb: do not break when watchpoint on local variable goes out of scope 但是它从未收到解决方案。

Is there any way to set GDB to go ahead and continue execution without a user prompt upon auto-removing a watchpoint?

没有

但是您可以在 return 上添加一个断点,并将命令附加到该断点以删除观察点并继续。那么GDB将不会有任何活动的观察点自动删除,所以它不会在函数returns.

时停止

您可以为 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]