这两天linux下调试程序到用到了GDB,在这里总结下:
首先,要使用gdb的话,必须在用gcc编译时,使用 -g 选项,在可执行文件中加入调试信息,这样后续就可以用gdb进行调试了。
1. 开始调试
进入gdb后,先使用file命令加载可执行文件,然后可以使用run/r或者start命令,GDB建立子进程来运行被调试程序,另外,run和start命令后面都可以加上传递给被调试程序的参数,若不加参数则使用GDB启动时传递的参数或者使用set args命令设置的参数。
run和start命令稍有不同,即run仅仅加载程序然后运行,直到断点或者程序结束,而start会在程序的入口函数(main)设置一个临时断点,程序运行到那里就会暂停,临时断点也随即被清除。
2. 设置断点
命令 | 解释 |
break/b | 使用格式:break [文件名] : [函数名/行号] [ if 条件] 添加断点到指定的位置,如果又条件的话,则还需要满足if条件程序才会停下 |
tbreak/tb | 格式同break/b 设置临时断点,即断点只起到一次作用 |
info b | 查看所有断点 |
del 断点号 | 删除一个短线,断点号可通过info b得到 |
del | 删除所有断点 |
示例:b main.cpp:main if argc==3
表示在main.cpp的main函数中设置断点,并且只有在该处argc==3时才停下
3. watch point,观察点
顾名思义,它一般用来观察某个变量/内存地址的状态(也可以是表达式),如可以监控该变量/内存值是否被程序读/写情况,因此watch一般和continue/c配合使用,用法如下:
命令 | 解释 |
watch 表达式 | 当表达式的值被改变时,停止 |
awatch 表达式 | 当表达式被读/写时,停止 |
rwatch 表达式 | 当表达式被读时,停止 |
4. 执行程序
命令 | 解释 |
step/s | 相当于step into |
next/n | 相当于step over |
continue/c | 执行程序直到断点 |
where | 显示当前所在的函数和行号 |
until 行号 | 执行直到指定的位置(位置必须在当前栈帧,并且该命令碰到断点会停下来) |
finish | 执行直到当前函数结束 |
return 栈帧号 | 返回指定的栈帧,若不带参数,默认为当前栈帧 |
其中,s和n后还可以带一个数字作为参数,表示执行k次s或者n
5. 查看变量
|
|
p 变量名 | 函数名和文件名用来限制待查看变量的作用域 |
display 变量名 | 程序每次停下来时,都会打印 |
info display | 查看display的设置信息 |
undisplay display序号 | 取消指定序号的display设置 |
del display | 删除所有的display设置 |
调试完成后,quit命令用于退出gdb
从上可知,gdb的功能事非常强大的,也很复杂,这里只是列举出了常用的一些命令,其他更复杂或者不常用的命令的使用,就多看gdb的man文档咯。
最后,欢迎拍砖