note:编译程序的时候需要增加-g选项,增加调试信息
1.启动GDB
gdb只是装载了程序,并没有运行,gdb默认启动后会显示gdb的版权信息,如果不想看版权信息可以增加-q选项。
2.退出GDB
q 或 quit
3.调试程序有两种方式:
(1)gdb -q test
(2)gdb -q
file test
4.退出调试
kill
5.查看调试文件源码:list
list:显示开始的10行代码
list 5,10 显示第5到第10行的代码
list func 显示行数func周围的代码,以函数func为中心
list xxx.c:5,10 显示xxx.c 文件的5-10行代码
list xxx.c:func 显示xxxx.c 文件func函数周围的代码,一函数func为中心
6.设置断点:breakpoint或者watch
b 行号或者函数名或者(xxx.c:func)。
eg:b 12 //12行打断点
eg:b get_sum //函数get_sum打断点
eg:b test.cpp:get_sum //test.cpp 中的get_sum 打断点
b 行号或者函数名或者(xxx.c:func)if 条件表达式
eg b 12 if i==20 //当i=20的时候触发断点
watch 条件表达式不需要函数名或者行号,根据当前运行环境来决定 (note:当条件表达式的值发生改变的时候出发断点,并不是条件表达式为真或者为假)
eg watch i==20 //当i==20条件表达式的值发生改变的时候出发断点
7.查看所有断点info breakpoint
eg info b //显示所有断点详细信息
8.删除断点clear或者delete
clear 行号或者函数名对应b打断点的方式
eg clear 12 //删除12行的断点
eg clear get_sum //删除get_sum 的断点
delete 断点的序号,如果不填写则删除所有断点
eg delete //删除所有断点
eg delete 1 //删除断点序号为1的断点(序号从断点列表可以得知)
9.禁用启动断点disable或者enable
disable 断点序号
eg disable 1//禁用断点序号为1的断点`
enble 断点序号
eg enable 1//启动断点序号为1的断点
10.查看调试信息
a.查看变量信息:p(print) 变量 eg:p i
b.查看变量数据类型:whatis 变量 打印变量或者表达式数据类型 eg:whatis i
c.查看变量类型的具体定义:ptype 变量或者类型 eg:ptype i
d.设置变量值: set variable 变量 = val eg: set variable i=10 设置i=10`
e.当前作用域内一直显示该变量:display variable(p指令只显示一次),取消使用undisplay 序号
11.查看调用堆栈
#bt或者where都可以
bt:backtrace
where:Print backtrace of all stack frames, or innermost COUNT frames.
12.查看具体帧的调用信息
#f Num,Num 即bt列出的帧序号#0 #1等,f是frame的简写
f 0
13.查看汇编
disassemble
14.单步调试
n:next 执行下一指令如果是函数不会进入函数,函数当做一条指令
s:step 执行下一指令如果是函数则进入函数
fin:finish 跳出当前执行函数
ni:nexti (汇编指令)执行下一机器指令*如果是函数不会进入函数
si:stepi (汇编指令)执行下一步指令如果是函数则进入函数
c:continue 继续运行直至下一断点
15.多线程调试
#列出当前进程的线程id,最前面的为当前线程序号
info thread
#切换到指定序号的线程调试
thread seq
16.gdb获取帮助信息
#gdb模式输入help 具体指令(可选)
help
17.调试步骤
1.启动gdbgdb -q test
2.浏览源文件设置断点 list和b
3.开始调试run
4.单步调试
5.查看变量信息
6.跳转到下一断点c(continue)
7.结束调试kill
或者重新调试run
8.退出gdbq(quit)
18.调试子进程(fork)
set follow-fork-mode [parent|child]
parent: fork之后继续调试父进程,子进程不受影响。
child: fork之后调试子进程,父进程不受影响。
启动gdb:
gdb) set follow-fork-mode child
set detach-on-fork [on|off]
on: 断开调试follow-fork-mode指定的进程。
off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。
19.调试core
core.xxx core文件往往以core+进程id构成文件
app 运行程序名称
gdb -c core.xxx app
whereis 或者 bt 查看崩溃位置
关于更多core调试请查看:Core基本调试 查看core dumped的详细错误原因