gdb调试
gdb概述:
UNIX及UNIX-like下的调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具相比于VC、z的优点是具有修复网络断点以及恢复链接等功能,比BCB的图形化调试器有更强大的功能。所谓“尺有所短,寸有所长”就是这个道理。
注意,如果要使用gdb调试指定的C/C++程序,则该程序在编译时要添加:-g选项,如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。
gdb调试相关命令
调试
- s:step,即跳进调用的函数
- n:next,继续执行下一行代码,单条语句执行
- c:继续运行程序,continue的缩写
添加断点
- 特定行加断点:b 文件名:行号
- 指定函数:b func,或 break func
- 退出函数:finish
设置断点的方法:
break <function>
在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。
break <linenum>
在指定行号停住。
break +offset
break -offset
在当前行号的前面或后面的offset行停住。offiset为自然数。
break filename:linenum
在源文件filename的linenum行处停住。
break filename:function
在源文件filename的function函数的入口处停住。
break *address
在程序运行的内存地址处停住。
break
break命令没有参数时,表示在下一条指令处停住。
break ... if <condition>
...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。
查看断点时,可使用info命令,如下所示:(注:n表示断点号)
info breakpoints [n]
info break [n]
条件断点
- 在上面添加断点后输入: if 表达式,只有在表达式为true的时候断点才会生效
查看:
- 查看断点:info b回车,或者info break
- 查看堆栈:bt
断点管理
查看断点:info b回车后,会打印断点的编号及所在位置、是否使能等;如果要删除某个断点,可以:a)d 编号,b)delete 编号;如果要使某个断点disable/enable,可以:disable/enable 编号;
打印变量
- p 变量名,print的缩写
退出程序:
- q:quit的缩写
调试正在运行的进程
已知进程号,通过gdb调试并查看问题:gdb -p 进程号
调试中使用已编写好的断点文件
- 在gdb调试过程中,可以通过 source xx文件的形式,这样不用每次都手动输入断点信息
启动gdb
启动gdb有以下三种方式:
1、gdb <program>
program也就是你的执行文件,一般在当然目录下。
2、gdb <program> core
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
3、gdb <program> <PID>
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试它。program应该在PATH环境变量中搜索得到。
参考: