Overview:
详解
上图(截自GDB Cheat Sheet)中,指出了GDB中查看指定内存地址内容的指令:
examine命令(简写是x)。
x命令的语法如下所示:
x/ <n/f/u> <addr>
其中,n、f、u是可选的参数。addr表示待查看的内存地址。
n | 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址(units)的内容。 |
---|---|
f | 表示显示的格式(format),见下面“GDB打印数据显示格式”。如果地址所指的是null-terminated string,那么格式可以是s,如果地址是machine instruction,那么格式可以是i。默认初始使用十六进制格式。 |
u | 表示(the unit size)从当前地址往后请求的位宽大小。如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了位宽长度后,GDB会从指内存定的内存地址开始,读写指定位宽大小,并把其当作一个值取出来。 |
n/f/u三个参数可以一起使用。例如:
命令:x/3uh 0x7ff320
表示,从内存地址0x7ff320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十进制显示无符号整型。GDB打印数据显示格式:[参考这儿][1]
x (hexadecimal)按十六进制格式显示变量。
d (signed decimal)按十进制格式显示变量。
u (unsigned decimal)按十进制格式显示无符号整型。
o (octal)按八进制格式显示变量。
t (binary)按二进制格式显示变量。
a (address)按十六进制格式显示地址,并显示距离前继符号的偏移量(offset)。常用于定位未知地址(变量)。
c (character)按字符格式显示变量。
f (floating)按浮点数格式显示变量。
**示例**
(gdb) p buf
$1 = 101
(gdb) p/a buf
$2 = 0x65
(gdb) p/c buf
$3 = 101 'e'
(gdb) p/f buf
$4 = 1.41531145e-43
(gdb) p/x buf
$5 = 0x65
(gdb) p/t buf
$6 = 1100101
(gdb) x/10x $sp 打印当前栈stack的前10个元素
Notes:
一个很好用的GDB速查手册:GDB Cheat Sheet