您的位置:首页 > 运维架构 > Linux

[zhuan]Linux下GDB调试跟踪工具

2011-06-01 16:07 267 查看
http://blog.163.com/qianshch@126/blog/static/48972522200971195543869/

公司给我一个很重要的任务——阅读大约十几万行的C语言代码,读懂后要画流程图并讲解。老总提示要在Linux下进行调试跟踪,才比较容易理解。于是,我上网搜了很多关于GDB的文章,认真阅读后受益匪浅。下面是对我今天学习内容的总结——主要是将GDB的命令做记录。

一、执行程序
1、run命令 可附带给程序的任何参数,包括标准输入输出说明符(<和> ) 和shell通配符等
2、set args 可修改发送给程序的参数,如set args -n
3、show args 可查看其参数的列表
4、backtrace(bt)为堆栈提供向后跟踪功能,产生一张列表,显示参数的调用情况
5、next(n) 不进入函数内部的单步执行
6、step(s) 进入函数内部的单步执行(5、6两个经常结合着用)
7、finish 退出函数内部并返回调用函数中;结束执行当前函数显示其返回值
8、call func 调用和执行一个函数func
9、path 可设置程序的运行路径:
**show paths查看程序的运行路径
**set environment varname [=var] 设置环境变量
**show environment [varname]查看环境变量
10、cd 可以切换工作目录;
11、pwd 显示当前的所在目录
12、info terminal 显示程序用到的终端模式;>重定向
13、调试运行中的程序:用ps aux查进程号,再gdb中使用attach pid(进程号)
二、数据的查看与赋值
1、print命令 检查或赋予各个变量的值,显示被调试的语言中任何有效的表达式,可以包含对程序中函数的调用、数据结构和其他复杂对象、值的历史成分以及认为数组。
**print base@ length:显示内存中在便利那个base之后的length个元素的值。
2、whatis命令 识别数组或者变量的数据类型
3、ptype命令 比whatis 强大,可提供一个结构体的定义
4、set var 可为某个变量赋值
5、list命令 显示源代码:
**list linenum 显示程序第linenum行周围的源程序
**list function 显示函数名为function的函数的源程序
**list 显示当前行后面的源程序
**list –显示当前行前面的源程序
**set listsize num 设置一次显示源代码的行数为num行
**show listsize 查看当前listsize的设置
**list first,last 显示从first行到last行之间的源代码
7、info命令 显示相应的信息:
**info threads命令来查看正在运行程序中的线程信息
**info args 打印出当前函数的参数名及其值
**info locals打印出当前函数中所有的局部变量及其值
**info catch打印出当前的函数中的异常处理信息
8、search命令 搜索源代码
**forward-search search向前搜索满足search的源代码
**reverse-search search 全部搜索满足search的源代码
三、断点及其管理
1、break(br)可以在调试程序中设置断点,
**break line-number使程序恰好在执行给定行之前停止
**break function-name使程序恰好在进入指定的函数之前停止
**break line| function if con 若con为真,程序到达指定行或者函数时停止
**break routine-name 在指定例程的入口处设置断点
**break +/-offset在当前行号的前面或后面的offset行停住
**break *address在程序运行的内存地址处停住
**break在下一条指令处停住
**指定在某个文件file中设置断点break file:line-number| function –name
2、continue(C)从断点中继续运行
3、quit(q)命令退出程序
4、断点的管理:
**info break 显示当前gdb的断点信息
**del (break) num删除指定的某个断点
**disable(break) num 禁止使用某个断点
**enable (break) num 允许使用某个断点
**clean num 清除源文件中某一代码行上的所有断点
四、在gdb中暂停和恢复程序的运行
暂停的方式:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(ThreadStops)。
1、设置观察点WatchPoint 观察某个表达式得知是否有变化,如果有马上停住程序的运行
**watch为表达式设置一个观察点,一旦表达式值有变化时,马上停住程序
**rwatch当表达是被读时,停住程序
**awatch当表达式的值被读或写时,停住程序
**info watchpoints列出当前所设置了的所有观察点
2、设置捕捉点CatchPoint可设置捕捉点来捕捉程序运行时的一些事件
**throw 一个C++抛出的异常
**catch 一个C++捕捉到的异常
**exec 调用 系统调用exec时
**fork 调用 系统调用fork时
**vfork 调用 系统调用vfork时
**load 或 load 载入 共享库(动态链接库)。
**unload 或 unload 卸载共享库(动态链接库)。
**Tcatch只设置一次捕捉点,当程序停住以后,对应点被自动删除
五、多线程的跟踪
1、查看当前运行的线程:info thread 其中前面的*表示该线程为当前跟踪的线程
2、切换跟踪线程:thread threadID 这里的线程ID是GDB自动分配的编号
3、进入线程执行任务所调用的函数
如:下面的函数创建一个可以执行抓包调度任务的线程(调用函数pcapDispatch),这时如何跟踪到pcapDispatch函数呢?
createThread(&myGlobals.device[i].pcapDispatchThreadId, pcapDispatch, (char*)((long)i));
****在createThread这一行设置断点 br 行号
****在pcapDispatch函数处设置断点 br pcapDispatch
然后当跟踪到createThread这一行时,通过命令n,便可以进入到pcapDispatch函数中。
这段时间经常对多线程程序进行跟踪,摸索出来了跟踪的方法。
还有很多方面的内容,还需日后耐心学习掌握!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: