f 按浮点数格式显示变量。
还是以辅助程序来说明,正常方式打印字符数组c:
(gdb) p c
$18 = "hello,shouwang"
但是如果我们要查看它的十六进制格式打印呢?
(gdb) p/x c
$19 = {0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x73, 0x68, 0x6f, 0x75, 0x77, 0x61,
0x6e, 0x67, 0x0}
(gdb)
但是如果我们想用这种方式查看浮点数的二进制格式是怎样的是不行的,因为直接打印它首先会被转换成整型,因此最终会得到8:
(gdb) p e
$1 = 8.5
(gdb) p/t e
$2 = 1000
(gdb)
那么就需要另外一种查看方式了。
查看内存内容
examine(简写为x)可以用来查看内存地址中的值。语法如下:
x/[n][f][u] addr
其中:
- n 表示要显示的内存单元数,默认值为1
- f 表示要打印的格式,前面已经提到了格式控制字符
- u 要打印的单元长度
- addr 内存地址
单元类型常见有如下:
- b 字节
- h 半字,即双字节
- w 字,即四字节
- g 八字节
我们通过一个实例来看,假如我们要把float变量e按照二进制方式打印,并且打印单位是一字节:
(gdb) x/4tb &e
0x7fffffffdbd4: 00000000 00000000 00001000 01000001
(gdb)
可以看到,变量e的四个字节都以二进制的方式打印出来了。
自动显示变量内容
假设我们希望程序断住时,就显示某个变量的值,可以使用display命令。
(gdb) display e
1: e = 8.5
那么每次程序断住时,就会打印e的值。要查看哪些变量被设置了display,可以使用:
(gdb)info display
Auto-display expressions now in effect:
Num Enb Expression
1: y b
2: y e
如果想要清除可以使用
delete display num
或者去使能:
disable display num #num为前面变量前的编号,不带num时去使能所有
微信公众号【编程珠玑】:专注但不限于分享计算机编程基础,Linux,C语言,C++,算法,数据库等编程相关[原创]技术文章,号内包含大量经典电子书和视频学习资源。欢迎一起交流学习,一起修炼计算机“内功”,知其然,更知其所以然。
公众号编程珠玑
查看寄存器内容
(gdb)info registers
rax 0x0 0
rbx 0x0 0
rcx 0x7ffff7dd1b00 140737351850752
rdx 0x0 0
rsi 0x7ffff7dd1b30 140737351850800
rdi 0xffffffff 4294967295
rbp 0x7fffffffdc10 0x7fffffffdc10
(内容过多未显示完全)
总结
通过不同方式查看变量值或者内存值能够极大的帮助我们判断程序的运行是否符合我们的预期,如果发现观察的值不是我们预期的时候,就需要检查我们的代码了。