在不停止执行的情况下观察 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]
我试图让 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]