1. 查看当前函数参数
当程序在函数中暂停后,即可查看函数的参数。语法如下:
info agrs
或者
i args
使用示例
(gdb) b fun_test
Breakpoint 1 at 0x969: file demo.cpp, line 6.
(gdb) r
Starting program: /home/wohu/cppProject/book_debug/chapter_3.1/demo
ret is 8
Breakpoint 1, fun_test (a=10, str=0x555555554b21 "test") at demo.cpp:6
6 printf("a is %d, str is %s\n", a, str);
(gdb) info args
a = 10
str = 0x555555554b21 "test"
(gdb) i args
a = 10
str = 0x555555554b21 "test"
(gdb)
2. 查看/修改变量的值
在程序命中断点时,可以查看变量的值。这个变量可以是全局变量,也可以是局部变量,而且当前上下文能够访问的变量都可以查看。语法如下:
print 变量名
p 变量名
如果要修改查看到的变量值,可以使用下述命令:
print 变量名=值
即如果要改变 x 变量的值,将它修改为 20,可以使用命令 p x=20 。对于结构体或者类对象,也可以使用这种方式修改成员的值,例如 p test->x=30 、p node.ID=100 等。
完整示例过程
(gdb) p a
$1 = 10
(gdb) p str
$2 = 0x555555554b21 "test"
(gdb) p x = 20
No symbol "x" in current context.
(gdb) p a = 20
$3 = 20
(gdb) c
Continuing.
a is 20, str is test
Breakpoint 1, fun_test (a=10, str=0x555555554b21 "test") at demo.cpp:6
6 printf("a is %d, str is %s\n", a, str);
(gdb)
2.1 使用gdb内嵌函数
在使用 print 或者 p 命令时,可以直接使用 gdb 内嵌的一些函数(比如 C 函数),比如 sizeof 、strcmp 等,也可以使用一些常见的表达式。当使用内嵌函数时,通常不是查看某个变量的值,而是进行一些计算或者比较等操作。这样,就可以实时地查看一些信息。
比如,想了解 long 在 Linux gcc 下占用几个字节长度、某个结构体所占用的空间大小等,都可以使用sizeof 来计算。比如可以直接使用 p sizeof(long) 、p sizeof(NODE) 等。
(gdb) p sizeof(int)
$4 = 4
(gdb) p sizeof(long)
$5 = 8
(gdb) p sizeof(void*)
$6 = 8
(gdb) p 12 == 12
$7 = true
2.2 查看结构体/类的值
当命中第38行的断点时,可以查看 new_node 的值。由于 new_node 是一个指针,因此可以查看这个指针本身,也可以查看其成员的值,如图所示。
但是我们会发现,要查看结构体各个成员的值比较麻烦,因为这个结构体有 3 个数据成员,所以使用了3 次 p 命令。查看 new_node 结构体更加方便的方式是直接查看这个结构体的对象值,而不是new_node 指针本身。也就是说,在查看 new_node 指针指向的内容的值时,使用 p *new_node 可以显示整个结构体的成员信息,如图所示。
我们还可以删除上图中显示的空字符,使显示更美观。在 gdb 中输入 set print null-stop 命令,设置字符串的显示规则,即遇到结束符时停止显示。通过设置之后,再次执行 p *new_node 命令,Name部分不会再显示空字符,如图所示。
如果结构体的成员比较多,这种显示仍然会杂乱无章,不方便查看每一个成员的数据,也就是说还不够漂亮(pretty)。gdb 还提供了一个使显示更加漂亮的选项,命令为 set print pretty 。设置之后,我们再次使用 p *new_node 命令来查看,结果如图所示。 类变量也可以使用 p 命令来显示,只要设置了 print pretty ,显示出来的类成员也与结构体成员相同,如图所示。
2.3 查看数组
同样,使用 print 或者 p 命令也可以查看数组的信息。 启动调试后,为print_arr_test函数设置断点,在该函数中查看两个数组iarr和strarr的值,如图所示。 该显示的问题与查看结构体的问题相同,即不太美观。在执行 set print pretty 命令后,数组的显示效果并没有改善。控制数组显示的命令为 set print array on ,其中 on 可以省略,默认情况下为 off ,因此在 gdb 中执行 set print array 命令,以便能够在显示数组时更方便查看,如图所示。
|