GDB print和display命令:查看变量表达式值
前面章节中提到,使用 GDB 调试程序,最常用的方法是:单步调试或者断点调试程序,期间通过查看某个变量或者表达式的值,判断当前程序的执行过程是否正确,不断缩小异常或 Bug 位于代码中的范围,最终找到并修复。 对于在调试期间查看某个变量或表达式的值,GDB 调试器提供有 2 种方法,即使用 print 命令或者 display 命令。本节就对这 2 个命令的功能和用法做详细的讲解,整个讲解过程将以调试如下 C 语言程序为例:
~/demo/main.c 文件中(~ 代指当前系统登录用户的主目录),并且已经其编译为可供 GDB 调试的 main.exe 可执行文件:
[root@bogon demo]# gcc main.c -o main.exe -g [root@bogon demo]# ls main.c main.exe GDB print命令前面章节中,我们已经多次接触并使用了 print 命令,它的功能就是在 GDB 调试程序的过程中,输出或者修改指定变量或者表达式的值。print 命令可以缩写为 p,最常用的语法格式如下所示: (gdb) print num (gdb) p num 其中,参数 num 用来代指要查看或者修改的目标变量或者表达式。 以调试 main.exe 为例:[root@bogon demo]# gdb main.exe -q Reading symbols from ~/demo/main.exe...done. (gdb) l 1 #include <stdio.h> 2 int main(){ 3 int num,result=0,i=0; 4 scanf("%d", &num); 5 while(i<=num){ 6 result += i; 7 i++; 8 } 9 printf("result=%dn", result); 10 return 0; (gdb) 11 } (gdb) b 3 Breakpoint 1 at 0x40053c: file main.c, line 3. (gdb) r Starting program: /root/demo/main.exe Breakpoint 1, main () at main.c:4 4 scanf("%d", &num); (gdb) n 3 5 while(i<=num){ (gdb) p num <--输出 num 的值 $1 = 3 (gdb) p num=4 <-- 修改 num 的值为 4 $2 = 4 (gdb) b 9 Breakpoint 2 at 0x400569: file main.c, line 9. (gdb) c Continuing. Breakpoint 2, main () at main.c:9 9 printf("result=%dn", result); (gdb) p result <-- 输出 result 的值 $2 = 10 (gdb) p result=20 <-- 修改 result 的值 $2 = 20 (gdb) c Continuing. result=20 Program exited normally. (gdb) 可以看到,调试 main.exe 的过程中,我们先后使用 p 命令输出了程序中 num 和 result 变量的值,同时还使用该命令对它们的值做了修改。
GDB display命令和 print 命令一样,display 命令也用于调试阶段查看某个变量或表达式的值,它们的区别是,使用 display 命令查看变量或表达式的值,每当程序暂停执行(例如单步执行)时,GDB 调试器都会自动帮我们打印出来,而 print 命令则不会。 也就是说,使用 1 次 print 命令只能查看 1 次某个变量或表达式的值,而同样使用 1 次 display 命令,每次程序暂停执行时都会自动打印出目标变量或表达式的值。因此,当我们想频繁查看某个变量或表达式的值从而观察它的变化情况时,使用 display 命令可以一劳永逸。 display 命令没有缩写形式,常用的语法格式如下 2 种:(gdb) display expr (gdb) display/fmt expr 其中,expr 表示要查看的目标变量或表达式;参数 fmt 用于指定输出变量或表达式的格式,表 1 罗列了常用的一些 fmt 参数。
仍以调试 main.exe 为例: (gdb) b 4 Breakpoint 1 at 0x40053c: file main.c, line 4. (gdb) b 9 Breakpoint 2 at 0x400569: file main.c, line 9. (gdb) r Starting program: /root/demo/main.exe Breakpoint 1, main () at main.c:4 4 scanf("%d", &num); (gdb) display num 1: num = 32767 (gdb) display/t result 2: /t result = 0 (gdb) n 3 5 while(i<=num){ 2: /t result = 0 1: num = 3 (gdb) c Continuing. Breakpoint 2, main () at main.c:9 9 printf("result=%dn", result); 2: /t result = 110 1: num = 3 (gdb) c Continuing. result=6 Program exited normally. (gdb) 可以看到,使用 display 命令查看 num 和 result 变量值时,不仅在执行该命令的同时会看到目标变量的值,后续每次程序停止执行时,GDB 调试器都会将目标变量的值打印出来。(编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |