GDB调试
要进行调试程序首先要生成一个含有调试信息的执行程序命令如下:
- gcc(g++) -g -o 文件名 源文件.c(源文件.cpp)
- gcc(g++) -ggdb3 -o 文件名 源文件.c(源文件.cpp)
此时便会生成一个含有调试信息的可执行文件,然后便可以用 gdb 去调试这个程序了,进入调试程序命令,但是如果用 gdb 去调试一个未包含调试信息的可执行文件则会发生错误
GDB 工作环境相关命令
- show args 查看设置好的运行参数
- path dir 设定程序的运行路径
- show parths 查看程序的运行路径
- pwd 显示当前工作目录
查看源程序
显示源代码
- list [linenum | filename:linenum] 显示程序第linenum行的周围的源程序.
- list [function | filename:function] 显示函数名为function的函数的源程序.
- list 显示当前行后面的源程序.
- list - 显示当前行前面的源程序.
- list n 行号.
- list +num 当前行号的正偏移量.
- list -num 当前行号的负偏移量.
- list *address 程序运行时的语句在内存中的地址.
- list first,last 显示从first行到last行之间的源代码.
- list,last 显示从当前行到last行之间的源代码.
- list + 往后显示源代码.
设置显示的函数
- set listsize count 设置一次显示源代码的行数.
- show listsize 查看当前listsize的设置.
搜索源代码
- forward-search regexp 向后搜索
- search regexp 向前面搜索
- reverse-search regexp 全部搜索.
<regexp>就是正则表达式,也主一个字符串的匹配模式,关于正则表达式,我就不在这里讲了,还请各位查看相关资料.
断点
设置断点
- break [function | filename:function] 在进入指定函数时停住.C++ 中可以使用 class::function或function(type,type)格式来指定函数名.简写命令为b
- break [linenum | filename:linenum] 在指定行号停住.
- break [+ | -]offset 在当前行号的前面或后面的 offset 行停住.offiset 为自然数.
- break break 命令没有参数时,表示在下一条指令处停住.
- break ... if condition ...可以是上述的参数,condition 表示条件,在条件成立时停住.比如在循环境体中,可以设置 break if i=100,表示当 i 为 100 时停住程序.
- tbreak 用法同 break 相同只设置一个临时断点,当程序遇到临时断点停住以后,对应断点被自动删除.
查看断点信息
- info [breakpoints | break]
禁用/启用断点
- disable [breakpoints | range] disable 所指定的停止点,breakpoints 为停止点号.如果什么都不指定,表示 disable 所有的停止点.简写命令是 dis . range 表示断点号的范围(如:3-7)
- enable [breakpoints | range] enable 所指定的停止点,breakpoints 为停止点号.
清除断点
- clear 清除所有的已定义的停止点.
- clear [function | filename:function] 清除所有设置在函数上的停止点.
- clear [linenum | filename:linenum] 清除所有设置在指定行上的停止点.
删除断点
- delete [breakpoints | range]删除指定的断点, breakpoints 为断点号.如果不指定断点号,则表示删除所有的断点.range 表示断点号的范围(如:3-7),简写命令为 d
设置和清除断点的停止条件
- condition bnum expression 修改断点号 为bnum 的停止条件为 expression.
- condition bnum 清除断点号为 bnum 的停止条件.
运行时忽略断点
- ignore bnum count 表示忽略断点号为 bnum 的停止条件 count 次.
设定断点处运行命令
- 设置断点运行命令( bnum:断点号, command-list: 程序在断点停住是做出的z指令)
commands [bnum]
... command-list ...
end
- 取消断点运行命令
commands [bnum]
end
例如:
(gdb)break foo if x>0
.....................(一些断点信息)
(gdb)commands 1
.....................(一些输入 commands 命令后的提示信息)
>printf "x is %d/n",x
>continue
>end
断点设置在函数 foo 中,断点条件是 x>0 ,如果程序被断住后,也就是,一旦 x 的值在 foo 函数中大于 0,GDB 会自动打印出 x 的值,并继续运行程序.
如果你要清除断点上的命令序列,那么只要简单的执行一下 commands命令 ,并直接在打个end就行了.
运行程序
运行程序
- run 让程序在 gdb 中运行
恢复运行中断后的程序
持续运行:
- continue [ignore-count]
- c [ignore-count]
- fg [ignore-count]
恢复程序运行,直到程序结束,或是下一个断点到来.ignore-count 表示忽略其后的断点次数.continue,c,fg 三个命令都是一样的意思.
- finish 运行程序,直到当前函数完成返回.并打印函数返回时的堆栈地址和返回值及参数值等信息.
- until/u 当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体.
单步运行:
- step count 单步跟踪,如果有函数调用,他会进入该函数.进入函数的前提是,此函数被编译有debug信息.后面加 count 表示执行后面的 count 条指令,然后再停住,不加表示一条条地执行.
设置单步运行模式(step-mode)
- set step-mode on 打开 step-mode 模式,于是,在进行单步跟踪时,程序不会因为没有 debug 信息而不停住.这个参数有很利于查看机器码.
- set step-mod off 关闭 step-mode 模式.
- next count 同样单步跟踪,如果有函数调用,他不会进入该函数.后面加 count 表示执行后面的 count 条指令,然后再停住,不加表示一条条地执行.
- stepi / si 单步跟踪一条机器指令
- nexti / ni 单步跟踪一条机器指令
查看函数堆栈信息
- backtrace n n 若为正整数,表示打印栈顶上n层的栈信息,若为负整数,表示打印栈底下n层的栈信息,命令缩写为bt
观察点
用于观察某个表达式(变量)的值是否有变化了,如果有变化,马上停住程序
设置观察点
- watch expr 为表达式(变量)expr设置一个观察点.一量表达式值有变化时,马上停住程序.
- rwatch expr 当表达式(变量)expr被读时,停住程序.
- awatch expr 当表达式(变量)的值被读或被写时,停住程序.
查看观察点信息
- info watchpoints
参考文献连接
http://blog.csdn.net/haoel/article/details/2879