GDB查看内存

上个章节讲解的是通过 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 必须在最前面。