一、概述
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。没有统一的界面,所有的操作都是通过命令的方式进行提供.对于习惯了图形界面方式进行调试的猿猿来说可能不是很顺手,但是如果你在linux下面开发,却不得不适应,很多疑问和问题,都必须通过gdb去定位,用的久了,它除了没有像VC、BCB等
IDE的调试界面外,其它的功能相对于可视化的调试工具都有过之无不及。所以,熟练掌握和使用gdb的调试方法将会使你在linux下面编程时如沐春风,左右逢缘.
一般来说,GDB主要做的事情如下:
1、启动程序,可以随心所欲的运行程序。
2、可让程序在你希望的地方或者满足你的条件的地方停住,方便检查程序的运行情况.
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
乍一看,和vc等调试工具没什么两样,甚至显得寒碜(没有好看、可以用鼠标点点的界面).但是它就像少林寺的扫地僧一样,内力深厚,低调却奢华.
二、常用功能
调试完成后使用quit命令退出即可.
- 启动程序
- 使用gdb命令进行启动,如: gdb <procname>
- 使用gdb进行启动程序,如: gdb <procname> procid .知道要调试的进程的进程ID,使用进程号进行附加.还可以直接使用下面的方法进行附加: gdb进入界面,在命令行中使用 attach procid 附加要要调试的进程,退出时使用detach取消挂接的进程.
- 使用gdb <procname> corename打开进程core信息.
在gdb中,编译信息只包含代码文件名称,如果源代码和可执行程序不在同一个目录时需要增加源代码搜索路径.方法为:
dir <dirpath>. or directory <dirpath>
如果需要指定多个路径,;linux下面使用“:”进行分割.
查看代码搜索路径的方法为:show directories
3、断点
断点可以设置在代码中的某一行或者某一个函数.
- 在某一行中设置断点:break / b <filename:linenumber>
- 在函数上设置断点:break / b <filename:functionname>
- 满足某一条件设置断点: break / b if <condition>. 如:break / b if i=100
- 在程序的运行内存地址处设置断点 break / b *address
删除所有断点为:delete breakpoint
删除指定断点:delete <breaknumber>; delete <breakpoint number>
4、运行
设置完断点后,就可以运行程序,运行程序使用run命令,也可以使用简写 r 进行操作.使用方法如下:
- 没有参数的: r or run
- 有参数的程序:run / r <启动参数> ;还可以使用set args命令设置进程参数,例如:set args 10 20 30 .设置完成后可以使用show args查看程序启动命令
- list <number>. 显示当前运行文件number行前后代码行数
- list <beginnumber,endnumber> 显示当前运行文件从beginnumber到endnumber的源代码行数
- list <function>显示函数包含代码语句
- list - 显示当前代码行前面的代码
- list + 显示当前代码行后面的代码
打印栈信息:bt <+-n>. 向前或者向后显示栈内容, frame <n> 切换栈层次
5、退出
调试完成后使用quit命令退出即可.
三、高级功能
使用常用功能后基本可以解决工作中遇到的80%的问题,可以让我们胜任目前的工作,gdb提供了很多其它功能,可以让我们脱离平庸.在调试代码的过程中更近一步.
1、优雅的显示打印信息
- set print pretty on 可以对输出的显示信息进行优雅的显示,可读性更强.set print pretty off关闭功能
- 打印地址信息:set addr on。使用set addr off关闭打印地址信息
- set array on,打开开关后会一行显示一个元素,关闭则每个元素以逗号分开.gdb中默认时关闭的.
- set print elements <number of elements> 这个选项设置显示数组大小,如果指定了长度,达到长度后gdb就不会在显示.使用show print element可以显示选项信息.
- set print null-stop <on/off> 打开后,遇到字符串结束后则终止打印.默认是关闭状态
- set print union <on /off> 打开后显示联合体内数据
- set print object <on / off> 如果一个对象指针指向派生类,打开后GDB按照虚方法调用规则进行打印,关闭的话GDB会忽略虚函数表.
- set print vtbl <on / off>. 打开后gdb使用优雅的格式显示虚函数表.
在gdb中使用shell <shell命令> 即可执行要执行的命令,如 shell cd /src/cpp则切换到指定目录.
3、info命令
- info registers 查看寄存器情况
- info all-registers 查看所有寄存器情况
- info registers <name> 查看指定寄存器的情况
- info frame 查看当前函数程序语言
- info source 查看当前文件的程序语言
- call <function> 强制调用函数
- return <exp> 在函数没有执行完成之前结束函数执行
- jump <linenumber /. addr >跳转到指定行数或者地址进行执行
- set var $PI=3.14 在调试中设置代码变量值.
四、总结
上面的介绍只是gdb中的一部分,掌握了这些基本可以扫清调试过程中遇到的问题,要想更清晰的了解gdb的使用,需要查看gdb官方帮助和使用手册.谢谢.
如果有问题请联系改成,本人公众号:CPP开发前沿,关注请扫二维码.