GDB(GNU Debugger)是GCC的调试工具,GDB主要帮忙你完成以下功能:
- 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序
- 可让被调试的程序在你所指定的调置的断点处停住(断点可以是条件表达式)
- 当程序被停住时,可以检查此时你的程序中所发生的事
- 动态的改变你程序的执行环境
GDB调试命令详解
-
list :显示程序中的代码
list 输出从上次调用list命令开始往后的10行程序代码
list - 输出从上次调用list命令开始往前的10行程序代码
list n 输出第n行附近的10行程序代码
list function 输出函数function前后的10行程序代码 -
forward/search :从当前行向后查找匹配某个字符串的程序行
forward/search 字符串 查找到的行号将保存在$_变量中,可以用print $_命令来查看 -
reverse/search :和forward/search相反,向前查找字符串
-
break :在程序中设置断点,当程序运行到指定行上时,会暂停执行
break 要设置断点的行号 -
tbreak :设置临时断点,在设置之后只起作用一次
tbreak 要设置临时断点的行号 -
clear :和break相反,clear用于清除断点
clear 要清除的断点所在的行号 -
run :启动程序,在run后面带上参数可以传递给正在调试的程序
-
awatch :用来增加一个观察点(add watch)
awatch 变量或表达式 当表达式的值发生改变或表达式的值被读取时,程序就会停止运行 -
watch :与awatch类似用来设置观察点,但程序只有当表达式的值发生改变时才会停止运行
watch 变量或表达式 需要注意的是,awatch和watch都必须在程序运行的过程中设置观察点,即可运行run之后才能设置 -
commands :设置在遇到断点后执行特定的指令
commands 设置遇到最后一个遇到的断点时要执行的命令
commands n 设置遇到断点号n时要执行的命令,注意:commands后面跟的是断点号,而不是断点所在的行号,在输入命令后,就可以输入遇到断点后要执行的命令,每行一条命令,在输入最后一条命令后输入end就可以结束输入 -
delete :清除断点或自动显示的表达式
delete 断点号 -
disable :让指定断点失效
disable 断点号列表 断点号之间用空格间隔开 -
enable :和disable相反,恢复失效的断点
enable 断点编号列表 -
ignore :忽略断点
ignore 断点号 忽略次数 -
condition :设置断点在一定条件下才能生效
condition 断点号 条件表达式 -
cont/continue :使程序在暂停在断点之后继续运行
cont 跳过当前断点继续运行。
cont n 跳过n次断点,继续运行,当n为1时,cont 1即为cont -
jump :让程序跳到指定行开始调试
jump 行号 -
next :继续执行语句,但是跳过子程序的调用
next 执行一条语句
next n 执行n条语句 -
nexti :单步执行语句,但和next不同的是,它会跟踪到子程序的内部,但不打印出子程序内部的语句
-
step :与next类似,但是它会跟踪到子程序的内部,而且会显示子程序内部的执行情况
-
stepi :与step类似,但是比step更详细,是nexti和step的结合
-
whatis :显示某个变量或表达式的数据类型
whatis 变量或表达式 -
ptype :和whatis类似,用于显示数据类型,但是它还可以显示typedef定义的类型等
ptype 变量或表达式 -
set :设置程序中变量的值
set 变量=表达式
set 变量:=表达式 -
display :增加要显示值的表达式
display 表达式 -
info display :显示当前所有的要显示值的表达式
-
delete display/undisplay :删除要显示值的表达式
delete display/undisplay 表达式编号 -
disable display :暂时不显示一个要表达式的值
disable display 表达式编号 -
enable display :与disable display相反,使用表达式恢复显示
enable display 表达式编号 -
print :打印变量或表达式的值
print 变量或表达式 表达式中有两个符号有特殊含义:$
和$$
,$
表示给定序号的前一个序号,$$
表示给定序号的前两个序号,如果$
和$$
后面不带数字,则给定序号为当前序号 -
backtrace :打印指定个数的栈帧(stack frame)
backtrace 栈帧个数 -
frame :打印栈帧
frame 栈帧号 -
info frame :显示当前栈帧的详细信息
-
select-frame :选择栈帧,选择后可以用info frame来显示栈帧信息
select-frame 栈帧号 -
kill :结束当前程序的调试
-
quit :退出gdb
GDB调试应用程序
gcc -g main.c -o a //在目标文件加入源代码的信息
(gdb) start/st //开始调试
(gdb) next/n //一条一条执行
(gdb) step/s //执行下一条,如果函数进入函数
(gdb) backtrace/bt //查看函数调用栈帧
(gdb) info/i locals //查看当前栈帧局部变量
(gdb) frame/f //选择栈帧,再查看局部变量
(gdb) print/p //打印变量的值
(gdb) finish //运行到当前函数返回
(gdb) set var sum=0 //修改变量值
(gdb) list/l 行号或函数名 //列出源码
(gdb) display/undisplay sum //每次停下显示变量的值/取消跟踪
(gdb) break/b 行号或函数名 //设置断点
(gdb) continue/c //连续运行
(gdb) info/i breakpoints //查看已经设置的断点
(gdb) delete breakpoints 2 //删除某个断点
(gdb) disable/enable breakpoints 3 //禁用/启用某个断点
(gdb) break 9 if sum != 0 //满足条件才激活断点
(gdb) run/r //重新从程序开头连续执行
(gdb) watch input[4] //设置观察点
(gdb) info/i watchpoints //查看设置的观察点
(gdb) x/7b input //打印存储器内容,b--每个字节一组,7--7组
(gdb) disassemble //反汇编当前函数或指定函数
(gdb) si //一条指令一条指令调试 而 s 是一行一行代码
(gdb) info registers //显示所有寄存器的当前值
(gdb) x/20 $esp //查看内存中开始的20个数
GDB调试core文件
gdb core应用程序 core文件 //调试core文件
(gdb) info threads //显示所有线程
(gdb) bt //显示线程堆栈信息
(gdb) thread thread_num //切换线程
(gdb) frame num //切换栈帧
(gdb) info r //显示当前帧的寄存器信息(每一帧的寄存器信息都是不相同的)