您的位置:首页 > 其它

gdb 调试总结

2014-10-26 23:10 246 查看
这两天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文档咯。

最后,欢迎拍砖

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: