上个章节讲解的是通过 print 命令打印程序中表达式信息,但是不能查看内存中的一些信息。而 GDB 中为我们提供了查看内存的命令 x,它是 examine 命令的简写,使用 x 命令查看内存数据的格式有很多种,这里的内存数据可以是任意类型。命令的详细介绍如下。
命令格式如下:
x /<n/f/u> <addr>
n、f、u 都是可选的参数,其中,n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容;f 表示显示的格式;u 表示将多少个字节作为一个值取出来,如果不指定的话,GDB默认是4个bytes,如果不指定的话,默认是4个bytes。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。<addr>表示一个内存地址。
参数 f 的可选值:
- x 按十六进制格式显示变量。
- d 按十进制格式显示变量。
- u 按十六进制格式显示无符号整型。
- o 按八进制格式显示变量。
- t 按二进制格式显示变量。
- a 按十六进制格式显示变量。
- c 按字符格式显示变量。
- f 按浮点数格式显示变量。
参数 u 的可选值:
- b 表示单字节
- h 表示双字节
- w 表示四字节
- g 表示八字节
实例:
(gdb) print arr
$5 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
(gdb) x /10dw arr
0x7fffffffdfb0: 1 2 3 4
0x7fffffffdfc0: 5 6 7 8
0x7fffffffdfd0: 9 0
(gdb) print main
$7 = {int (void)} 0x5555555546aa <main>
(gdb) x 0x5555555546aa
0x5555555546aa <main>: -443987883
注意:x 命令使用时,由于输出格式字符 f 和单位长度 u 的字符是不冲突的,所以在使用的时候不需要考虑这两个参数的顺序问题。例如,10dw 和 10wd和参数的执行效果相同,但是 n 必须在最前面。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/23656.html