(gdb) f 15
#15 0x00007fffeaf565a0 in loader_import (path=0x7fffeaf57300 “/home/wwwroot/redlight/framework/ThinkPHP/Conf/convention.php”, len=61, result=0x7fffffffdf88)
at /root/lnmp1.3-full/src/php-5.5.17/ext/thinkphp_c/thinkphp_c.c:100
loader_import有个指针参数 path,指向的地址是0x7fffeaf57300,好奇这个地址里到底存的是啥。于是直接p下
(gdb) p *0x7fffeaf57300
$14 = 1836017711
是一串数字,估计不是这么显示的。于是网上搜到了用 x命令。下面是x的显示方式
gdb) x/62b 0x7fffeaf57300
0x7fffeaf57300: 47 104 111 109 101 47 119 119
0x7fffeaf57308: 119 114 111 111 116 47 114 101
0x7fffeaf57310: 100 108 105 103 104 116 47 102
0x7fffeaf57318: 114 97 109 101 119 111 114 107
0x7fffeaf57320: 47 84 104 105 110 107 80 72
0x7fffeaf57328: 80 47 67 111 110 102 47 99
0x7fffeaf57330: 111 110 118 101 110 116 105 111
0x7fffeaf57338: 110 46 112 104 112 0
61表示打印出62个字节,最后1个字节0表示字符串结尾符号 ‘�’, b是指以字节显示。
打印出来的是ascii码,47 对应的是 /, 104 对应的是 h, 111对应的是o,组装起来就是/home/….
后来又发现可以直接打印出字符
(gdb) x/62c 0x7fffeaf57300 //也可简写为 x/62 0x7fffeaf57300
0x7fffeaf57300: 47 ‘/’ 104 ‘h’ 111 ‘o’ 109 ‘m’ 101 ‘e’ 47 ‘/’ 119 ‘w’ 119 ‘w’
0x7fffeaf57308: 119 ‘w’ 114 ‘r’ 111 ‘o’ 111 ‘o’ 116 ‘t’ 47 ‘/’ 114 ‘r’ 101 ‘e’
0x7fffeaf57310: 100 ‘d’ 108 ‘l’ 105 ‘i’ 103 ‘g’ 104 ‘h’ 116 ‘t’ 47 ‘/’ 102 ‘f’
0x7fffeaf57318: 114 ‘r’ 97 ‘a’ 109 ‘m’ 101 ‘e’ 119 ‘w’ 111 ‘o’ 114 ‘r’ 107 ‘k’
0x7fffeaf57320: 47 ‘/’ 84 ‘T’ 104 ‘h’ 105 ‘i’ 110 ‘n’ 107 ‘k’ 80 ‘P’ 72 ‘H’
0x7fffeaf57328: 80 ‘P’ 47 ‘/’ 67 ‘C’ 111 ‘o’ 110 ‘n’ 102 ‘f’ 47 ‘/’ 99 ‘c’
0x7fffeaf57330: 111 ‘o’ 110 ‘n’ 118 ‘v’ 101 ‘e’ 110 ‘n’ 116 ‘t’ 105 ‘i’ 111 ‘o’
0x7fffeaf57338: 110 ‘n’ 46 ‘.’ 112 ‘p’ 104 ‘h’ 112 ‘p’ 0 ‘�00’
以下是x命令的具体用法
gdb查看指定地址的内存地址的值:examine 简写 x—–使用gdb> help x 来查看使用方式
x/<n/f/u> <addr>
n、f、u是可选的参数。
<addr>表示一个内存地址。
n/f/u三个参数可以一起使用。例如:
命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。
n: 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
需要显示的内存单元个数,也就是从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的u定义。
u:每个单元的大小,按字节数来计算。 默认是4 bytes,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。
当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来,并使用格式f来显示。
b:1 byte h:2 bytes w:4 bytes g:8 bytes
f:表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
比如x/3uh 0x54320表示从内存地址0x54320读取内容,h表示以双字节为单位,3表示输出3个单位,u表示按照十六进制显示。
这种格式输出也可用于p
一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用GDB的数据显示格式:
(gdb) p i
$21 = 101
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 ‘e’
(gdb) p/f i
$24 = 1.41531145e-43
(gdb) p/x i
$25 = 0x65
(gdb) p/t i
$26 = 1100101