读书人

开源代码分析技艺之gdb单步调试

发布时间: 2013-11-03 15:39:14 作者: rapoo

开源代码分析技巧之——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思于家中床前

作者:铭毅天下

转载请标明出处,原文地址:http://blog.csdn.net/laoyang360/article/details/14102181

如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!

1楼u0127004271小时前
gou.aigou.com/dog/844329.htmlngou.aigou.com/dog/844330.htmlngou.aigou.com/dog/844331.htmlngou.aigou.com/dog/844332.htmlngou.aigou.com/dog/844333.htmlngou.aigou.com/dog/844334.htmlngou.aigou.com/dog/844335.htmlngou.aigou.com/dog/844336.htmlngou.aigou.com/dog/844337.htmlngou.aigou.com/dog/844338.html

读书人网 >开源软件

热点推荐