QQ图片20161026172615

 

(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(hex) 按十六进制格式显示变量。
              d(decimal) 按十进制格式显示变量。
              u(unsigned decimal) 按十进制格式显示无符号整型。
              o(octal) 按八进制格式显示变量。
              t(binary) 按二进制格式显示变量。
              a(address) 按十六进制格式显示变量。
              c(char) 按字符格式显示变量。
              f(float) 按浮点数格式显示变量

比如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

Comments are closed.

Post Navigation