Linux下GDB调试跟踪工具

来源:互联网 发布:九九乘法表c语言 编辑:程序博客网 时间:2024/04/30 04:57

公司给我一个很重要的任务——阅读大约十几万行的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函数中。

这段时间经常对多线程程序进行跟踪,摸索出来了跟踪的方法。

 还有很多方面的内容,还需日后耐心学习掌握!



http://blog.163.com/qianshch@126/blog/static/48972522200971195543869/

0 0
原创粉丝点击