在 gdb 调试程序中,设置观察点的方法可以监控程序中某个变量或者表达式的值,只要监控的变量或表达式的值发生改变,程序就会停止执行。
常用的监控变量(或表达式)的值的方式包括:watch 命令,rwatch 命令,awatch 命令。
查看所设置的观察点:
(gdb) info watchpoints
以下面代码为例,说明一下设置观察点的方法。代码如下:
#include <stdio.h>
int main(void)
{
int i = 0;
int data = 0;
for(i = 0; i< 20; i++)
{
data += i;
printf("***data: %d\n", data);
}
return 0;
}
1. watch 命令
watch 命令的语法格式: (其中,cond 指的就是要监控的变量或表达式。)
(gdb) watch cond
开始 gdb 调试,设置观察点,即监控变量 data 的值。
首先,输入 b main.c:6 命令,在代码第六行设置断点。
其次,输入 r 命令运行程序,程序会在第六行代码处停下。
然后,输入 watch data 命令,设置观察变量data的值。最后,输入 c 命令继续运行程序。
如下所示:
(gdb) b main.c:6
Breakpoint 1 at 0x1151: file main.c, line 6.
(gdb) r
Starting program: /home/wangtian/Code_Learns/C_Learns/debug/debug2/main.outBreakpoint 1, main () at main.c:8
8 for(i = 0; i< 20; i++)
(gdb) watch data
Watchpoint 2: data
(gdb) info watch
Num Type Disp Enb Address What
2 watchpoint keep y data
(gdb) c
Continuing.***data: 0
Watchpoint 2: data
Old value = 0
New value = 1
main () at main.c:11
11 printf("***data: %d\n", data);
可以看到,data 的值从 0 变为 1 时,程序停下来了。如果继续运行程序,则输入 c 命令(continue的缩写)。
也可以使用命令 watch *(data type*)address 的方式,设置监控变量的值。如下所示:
首先,输入p &data 命令,查看data的地址。
然后,可输入 watch *(int *) 0x7fffffffde64 命令设置观察点,监控变量 data 的值。
综上所述,watch data 命令与 watch *(int *) 0x7fffffffde64 命令这两种方式设置观察点的方法,效果是一样的。