gdb 笔记(06)— 查看当前函数参数、查看结构体/类的值、查看数组的值

1. 查看当前函数参数

当程序在函数中暂停后,即可查看函数的参数。语法如下:

info args

或者

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=30p 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 函数),比如 sizeofstrcmp 等,也可以使用一些常见的表达式。当使用内嵌函数时,通常不是查看某个变量的值,而是进行一些计算或者比较等操作。这样,就可以实时地查看一些信息。

比如,想了解 longLinux 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 查看结构体/类的值

1
当命中第38行的断点时,可以查看 new_node 的值。由于 new_node 是一个指针,因此可以查看这个指针本身,也可以查看其成员的值,如图所示。

56
但是我们会发现,要查看结构体各个成员的值比较麻烦,因为这个结构体有 3 个数据成员,所以使用了3 次 p 命令。查看 new_node 结构体更加方便的方式是直接查看这个结构体的对象值,而不是new_node 指针本身。也就是说,在查看 new_node 指针指向的内容的值时,使用 p *new_node 可以显示整个结构体的成员信息,如图所示。

57
我们还可以删除上图中显示的空字符,使显示更美观。在 gdb 中输入 set print null-stop 命令,设置字符串的显示规则,即遇到结束符时停止显示。通过设置之后,再次执行 p *new_node 命令,Name部分不会再显示空字符,如图所示。

58
如果结构体的成员比较多,这种显示仍然会杂乱无章,不方便查看每一个成员的数据,也就是说还不够漂亮(pretty)。gdb 还提供了一个使显示更加漂亮的选项,命令为 set print pretty 。设置之后,我们再次使用 p *new_node 命令来查看,结果如图所示。
59
类变量也可以使用 p 命令来显示,只要设置了 print pretty ,显示出来的类成员也与结构体成员相同,如图所示。
60

2.3 查看数组

同样,使用 print 或者 p 命令也可以查看数组的信息。
256启动调试后,为print_arr_test函数设置断点,在该函数中查看两个数组iarr和strarr的值,如图所示。
61
该显示的问题与查看结构体的问题相同,即不太美观。在执行 set print pretty 命令后,数组的显示效果并没有改善。控制数组显示的命令为 set print array on ,其中 on 可以省略,默认情况下为 off ,因此在 gdb 中执行 set print array 命令,以便能够在显示数组时更方便查看,如图所示。
655

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wohu007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值