开源代码分析技巧之二——gdb单步调试

简介: 在海量的源码面前,如何更好的切入到源码,锁定我们需要的那一行,有时显得格外重要。

开源代码分析技巧之二——gdb单步调试


 


       在海量的源码面前,如何更好的切入到源码,锁定我们需要的那一行,有时显得格外重要。


      而通常来讲,我们知道源码包,或多或许我们也同时有一些参考文档(可能不全),并且知道源码能提供的一些功能。比如以Samba4.0.0的源码为例,在samba4.0.0/source4下就有介绍source4新功能说明的帮助文档;在kerberos相关文件夹下就有介绍kerberos协议实现相关的文档;在Samba官网上有其从80-90年代一路走来各个版本的文档,信息量非常大,筛选需要花些时间。而对于一些功能的提供,往往是一些提供给我们可用的工具,比如安装Samba后在/usr/local/samba/bin下有samba-tool、tdbtool、rpcclient等工具。这样工具的用法,我们可以man一下,不同的参数便一目了然。


      顺着这个思路,我们就可以加上参数、子参数,运行设定的工具,这时候就有了执行这些程序的进程,可通过ps –aux查看。有了这些进程,我们就可以展开我们的单步调试了。


1、从SAMBA源码现身说法


       对于比如/usr/local/samba/bin目录下的文件,可以通过File查看文件属性,有的是编译好的二进制可执行文件,有的则是一些python脚本,可以vi打开查看源码的。但是二者都可以运行。对于前者二进制程序我们可以直接gdb可执行文件名称,如gdb rpcclient直接调试。而对于后者,我们只能通过pdb(python的单步调试方法)和 gdb结合的方式运行:


      第一步,pdb可执行文件名称,可以参数执行的进程号;


      第二步,通过ps –aux查看执行的进程号;


      第三步,gdbattach进程号进行调试。


2、gdb常用参数


      这个可以参考网络上有网友总结的很详细的版本。我列举下自己用的比较多的,抛砖引玉一下。


序号


单步调试指令


简写


释义


1


run


r


运行


2


stop


stop


暂停程序执行


3


break


b


设置断点,可用形式(b文件名:行号 /  b行号)


4


continue


c


继续,直至下一个断点


5


step


s


在某个函数断点处,执行s可以步入该函数单步调试


6


next


n


执行到当前模块下的下一条指令


7


enable



使得断点有效(enable断点号)


8


disable



使断点无效(disable断点号)


9


delete



删除断点(delete断点号)


10


clear



清除断点


11


ignore



忽略断点(ignore断点号忽略断点次数)


12


list


l


显示当前执行程序的代码行,默认10行,可手动修改


13


info



比如: info break可以查看当前所有断点信息


14


print


p


打印参数信息(p参数/变量名/数组成员/结构体成员)


15


ptype/whatis



显示数据类型


16


backtrace


bt


查看调用堆栈信息


17


command


command


在break后加command,会提示输入信息:此时类似一个脚本程序,你可以输入想要在断点处打印的信息,输入quit退出。(非常适合看循环单步调试的信息,不用每次手动输入)


18


search text



至上往下搜索,显示在当前文件中包含text的代码行



19


reverse-search text



至下往上搜索,显示包含text的代码行


20


attach



attach加进程号,进程相关调试


21


kill



结束当前的调试


22


quit



退出debug



       注意点:对于含参数指令的单步调试方法,比如rpcclient –U administrator%123456 –c “dsgetncchanges” 192.168.123.1,指令为rpcclient,后面的都是参数。这时候我们可以先运行gdb rpcclient ,此时调试并没有运行,可以通过run  –U administrator%123456 –c “dsgetncchanges” 192.168.123.1进入调试运行状态,加断点调试等。


3、开源代码gdb之我的思考


     在开源代码中,当我们不知道要break哪里才能有找到我们需要的的代码行或者代码片段时,我们可以结合以下几点定位:


     第1点:结合打印日志信息,从中提取搜索关键词,放入代码中搜索,便于定位断点区域;


     第2点:根据参考文档(自带的或者官网上的),锁定我们调试的代码行;


     第3点:没有可供参考的文档,只有源码,我们可以根据函数名或者文件名猜测其可能在的区域,在可能的区域多加几个断点试试。


4、结语


     gdb相关调试博大精深,需要在实践中揣摩,有了它,我们的静谧的源码才能动起来,动起来才能更利于我们源码的进一步深入分析。


      2013-11-3 am10:52思于家中床前


 


推荐阅读:


【1】开源代码分析技巧之一——打印调用逻辑


http://blog.csdn.net/laoyang360/article/details/12676131


【3】开源代码分析技巧之三——老外如是说


http://blog.csdn.net/laoyang360/article/details/16897117


【4】开源代码分析技巧之四——国外技术社区提问


http://blog.csdn.net/laoyang360/article/details/16897827


【5】开源代码分析技巧之四——高效Windows源码分析


http://blog.csdn.net/laoyang360/article/details/18186529


相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
3月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
64 10
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
102 3
|
3月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
105 0
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
43 1
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
31 0
|
5月前
|
NoSQL Linux C++
Linux C/C++ gdb调试正在运行的程序
Linux C/C++ gdb调试正在运行的程序
|
5月前
|
NoSQL Linux C++
Linux C/C++ gdb调试core文件
Linux C/C++ gdb调试core文件
|
6月前
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
386 2
|
6月前
|
NoSQL Linux 开发工具
【深入解析git和gdb:版本控制与调试利器的终极指南】(下)
【深入解析git和gdb:版本控制与调试利器的终极指南】
|
5月前
|
NoSQL Linux C++
Linux C/C++ gdb调试
Linux C/C++ gdb调试