GDB是GNU调试器(GNU symbolic Debugger)的缩写,是linux系统重标准调试工具,可通过对编译后的可执行文件进行调试,帮助定位程序的错误和异常。
常用的调试器有
名称 | 特点 |
---|---|
WinDbg | Windows 下的调试器,它的功能甚至超越了 Remote Debugger,它还有一个命令行版本(cdb.exe),但是这个命令行版本的调试器指令比较复杂,不建议初学者使用 |
Remote Debugger | Remote Debugger 是 VC/VS 自带的调试器,与整个IDE无缝衔接,使用非常方便 |
GDB | Linux 下使用最多的一款调试器,也有 Windows 的移植版 |
借助GDB调试器可以实现:
程序启动时,可以按照我们自定义的要求运行程序,例如设置参数和环境变量
可使被调试程序在指定代码处暂停运行,并查看当前程序的运行状态(例如当前变量的值,函数的执行结果等),即支持断点调试
程序执行过程中,可以改变某个变量的值,还可以改变代码的执行顺序,从而尝试修改程序中出现的逻辑错误
哪些程序可被调试?
支持gdb的,在编译时加上-g参数,保留了调试信息的可执行文件。第三方的检查是否支持gdb调试可以使用以下命令查看:
gdb test
提示no debugging symbols found.就不可以使用gdb调试。
readelf -S test|grep debug
若没有任何debug信息,不能被调试。
file test
若显示信息最后是stripped,则说明文件的符号表信息和调试信息被去除,不能调试。no stripped也不一定可以调试,看情况而定。
检查gdb是否安装有以下方法:
which gdb ——若已安装,显示gdb的完整路径
whereis gdb ——gdb安装路径以及其他相关文件路径信息
find / -name gdb ——搜索gdb并显示找到的路径,搜索整个文件系统
echo $PATH ——显示环境变量,若存在gdb路径则已安装
gdb -version ——gdb版本信息
启动gdb
默认情况下,run 指令会一直执行程序,直到执行结束。如果程序中手动设置有断点,则 run 指令会执行程序至第一个断点处;可带参数
start 指令会执行程序至 main() 主函数的起始位置,即在 main() 函数的第一行语句处停止执行(该行代码尚未执行)。
总的来说就是start默认在main主函数开始的位置设置了一个断点处理,接着在使用run处理。
设置断点
break n ——在n行设置断点
break func ——在函数名设置断点
break filename:n ——在filename对应的n行处设置断点
break addr ——在内存addr处设置断点,即暂停
break n if condition ——设置条件断点,如果condition满足则在n处设置断点
clear n ——清除n行处的断点
delete n ——清除n行处断点和自动显示的表达式命令
delete display n ——删除编号为display n的要显示的表达式
disable n/disable display n ——让编号为n的断点或其他暂时失效,多个断点失效可使用 disable n x y命令,使用空格隔开断点编号
enable n/enable display n ——让编号为n的断点或其他生效
display 表达式 ——显示表达式的值
jump ——指定吓一跳语句的运行点,格式:jump file:line、jump n ,容易发生错误,谨慎使用
whatis var ——显示表达式的数据类型
查看信息
info threads ——查看线程信息
info registera ——查看寄存器值
info locals ——查看当前函数中所有局部变量以及其值
info catch ——查看当前函数中的异常处理信息
info breakpoints ——查看断点信息
info watchpoints ——查看监控点信息
info display ——显示当前所有要显示值的表达式的值
info stack ——查看堆栈情况
info terminal ——程序使用的终端模式
thread x —调试的线程
查看当前栈帧
next ——逐行执行,不进入函数内部
nexti ——汇编
step ——逐行执行,并进入函数内部
stepi ——汇编
finish ——一直运行到函数返回并打印函数返回时的堆栈地址和返回值及参数值等信息
until 行数 ——运行到某一行
call 函数名 ——在当前位置执行函数
set var=x ——修改var的值为x
set args ——设置运行参数
set width 数目 ——设置GDB的行宽
print/p var 格式 ——查看var的值,格式可选:x:16进制 d:十进制 u:无符号数 o:八进制 c字符格式 f:浮点数
list ——查看当前位置附近的源代码
watch/awatch var ——监视变量var,当变量被读出或写入时程序被暂停
rwatch var ——监视变量var,当变量被读出时程序被暂停
catch ——设置捕捉点捕捉程序运行的一些事件
tcatch ——只设置一次捕捉点,程序停止以后被自动删除
x addr ——查看内存内容
continue/c ——继续执行程序
up ——查看调用栈上一层函数
down ——查看调用栈下一层函数
frame/f ——切换到编号为n的栈帧
cat 文件名 ——查看文件内容
more 文件名 ——分页显示文件内容,空格键逐页向下,Q退出
less 文件名 ——分页显示,空格键向下滚动一页,b键向上滚动一页,G跳转文件末尾,q退出
head -n 行数 文件名 ——查看文件的前面几行
tail -n 行数 文件名 ——查看文件的后几行
show args ——查看设置的运行参数
quit ——退出