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

时间:2018-11-06 14:23:59

标签: c gdb watchpoint

我试图让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 但是它从未收到解决方案。

2 个答案:

答案 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自动删除的活动监视点,因此当函数返回时它不会停止。