gdb 如何调试内存地址

来源:互联网 发布:淘宝规蜜投诉 编辑:程序博客网 时间:2024/06/03 18:49

样例代码

   int age= 20;   int *p_age = &age;    NSLog(@"p_age       = %p", p_age);   //输出指针变量p_age指向值20所在内存的地址   NSLog(@"&p_age      = %p", &p_age);  //输出指针变量p_age本身的地址
    2017-07-19 15:54:07.048 Test0719[27387:858079] p_age       = 0x7fff5313f65c    2017-07-19 15:54:07.050 Test0719[27387:858079] &p_age      = 0x7fff5313f650

问题来了

  1. 能不能通过地址0x7fff5313f65c0x7fff5313f650 查看内存地址中的值?
  2. 如何去验证:0x7fff5313f650 内存地址的值是:0x7fff5313f65c,而0x7fff5313f65c内存地址的值是20 ?

答案

gdb调试模式下,使用examine(简写x)命令可查看内存地址中的值!参考例子如下:

    2017-07-19 16:06:54.160 Test0719[27514:863331] p_age       = 0x7fff5c8d965c    2017-07-19 16:06:54.162 Test0719[27514:863331] &p_age      = 0x7fff5c8d9650    (lldb) x/d 0x7fff5c8d965c       //查看0x7fff5c8d965c内存地址的值,并以十进制方式输出。    0x7fff5c8d965c: 20              //输出结果是20    (lldb) x/x 0x7fff5c8d9650       //查看0x7fff5c8d9650内存地址的值,并以十六进制方式输出。    0x7fff5c8d9650: 0x5c8d965c      //输出结果是一个4字节大小的类似指针地址的值,而指针变量类型大小应该是8个字节    (lldb) x/g 0x7fff5c8d9650       //所以,这里使用g参数来表示字节8个字节,重新输出8个字节的内存地址的值    0x7fff5c8d9650: 0x00007fff5c8d965c  //8个字节大小的内存地址的值,它是一个地址    (lldb) x/d 0x00007fff5c8d965c       //查看0x00007fff5c8d965c 内存地址的值,并以十进制方式输出。    0x7fff5c8d965c: 6669152202784768020 //因为,不指定输出字节大小,默认应该输出4个字节内存大小,所以其值非常大    (lldb) x/1db 0x00007fff5c8d965c     //所以,调整为输出1个字节的内存大小的值,并以十进制方式输出    0x7fff5c8d965c: 20

X命令使用

x/<n/f/u> <address>

n、f、u是可选的参数。

n 是一个正整数,表示需要显示的内存单元的个数,也就是说从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的u定义。

f 表示显示的格式,参见下面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。

u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

输出格式

一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用GDB的数据显示格式:

x 按十六进制格式显示变量。

d 按十进制格式显示变量。

u 按十六进制格式显示无符号整型。

o 按八进制格式显示变量。

t 按二进制格式显示变量。

a 按十六进制格式显示变量。

c 按字符格式显示变量。

f 按浮点数格式显示变量。

原创粉丝点击