惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
N
Netflix TechBlog - Medium
WordPress大学
WordPress大学
罗磊的独立博客
H
Help Net Security
MongoDB | Blog
MongoDB | Blog
A
About on SuperTechFans
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
D
Docker
云风的 BLOG
云风的 BLOG
Microsoft Security Blog
Microsoft Security Blog
Blog — PlanetScale
Blog — PlanetScale
P
Proofpoint News Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
I
InfoQ
J
Java Code Geeks
博客园 - 聂微东
大猫的无限游戏
大猫的无限游戏
Engineering at Meta
Engineering at Meta
美团技术团队
小众软件
小众软件
Stack Overflow Blog
Stack Overflow Blog
C
Check Point Blog

博客园 - ~大器晚成~

我的2012 一个非重点校计算机专业毕业生的求职之路 Vim设置 推荐系统的循序进阶读物(从入门到精通) Hadoop 常见错误汇总 (转载) 信息检索技术——向量空间模型 信息检索技术——布尔检索 排序算法——堆排序 查找算法——找到序列中第二大的数(修正版) Hadoop 实现多个数据表的join操作 排序算法——快速排序 排序算法——冒泡排序 排序算法——选择排序 牛×的可视化排序 shell常用技巧 排序算法——插入排序 机器学习相关——文本分类综述 大公司 or 小公司 使用gdb进行调试中级篇
使用gdb进行调试高级篇
~大器晚成~ · 2012-02-09 · via 博客园 - ~大器晚成~

  之前写过两篇科普文章,使用gdb调试程序入门篇中级篇,今天打算把最后的一部分写完,就是所谓的高级篇。其实很简单,也没有多复杂。只是个人认为gdb的使用,掌握到这个地方,对于常规的调试需求就已经足够了。至于更高级的应用,肯定是多多益善。但是学习工具的目的就在于提高工作效率,没有必要为了技术而技术,技术永远都只是一种工具。不知道这个观点是否会被技术迷所鄙视,呵呵。不多废话了,言归正传。

  查看运行时数据

   在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据。print命令的格式是:   
     print <expr>
     print /<f> <expr>
       <expr>是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),<f>是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x。

  有时候,你需要查看一段连续的内存空间的值。比如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“@”操作符,“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度。例如,你的程序中有这样的语句:

  int *array = (int *) malloc (len * sizeof (int));

  于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:

  *array@len

  @的左边是数组的首地址的值,也就是变量array所指向的内容,右边则是数据的长度,其保存在变量len中,其输出结果,大约是下面这个样子的:    
    (gdb) p 
*array@len
    $1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40}
  

  输出格式

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

   x  按十六进制格式显示变量。
    d  按十进制格式显示变量。
    u  按十六进制格式显示无符号整型。
    o  按八进制格式显示变量。
    t  按二进制格式显示变量。 
    a  按十六进制格式显示变量。
    c  按字符格式显示变量。
    f  按浮点数格式显示变量。

     (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

  查看内存  

  你可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:
    x/<n/f/u> <addr>    
    n、f、u是可选的参数。
    n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
    f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
    u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
    <addr>表示一个内存地址。

    n/f/u三个参数可以一起使用。例如:    

    命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。

  注:关于gdb调试更多的内容,请查看http://blog.csdn.net/haoel/article/details/2883。