gdb是Linux环境下最强大的调试工具,可以调试未运行的程序或者正在运行的程序,还可以分析程序崩溃的coredump文件,这些的前提是,程序在编译时添加了-g选项打开了调试信息。
使用方法:
gdb program: 对于有参数的,可以通过gdb内执行 set args PARAM 来设置参数,或者gdb --args ./program arg1 arg2
gdb attach PID:直接挂载PID进程,此时进程会停止运行,需要命令c来继续运行
gdb program coredumpName :分析程序产生的coredump文件
1. 打断点
使用break进行打断点 ,简写为b , 对程序的第三行进行打断点: b 3
如果是多个文件,可以对某个文件的某一行打断点,如对gdb_test.c的第三行打断点: b gdb_test.c:3
可以对某个函数进行打断点 ,对本程序中func()函数打断点: b func
同理也可以对多个文件中的某一个文件的函数打断点 : b gdb_test.c:func
2. gdb常用命令
l :查看原代码(l n,从第n行开始查看代码。l 函数名:查看具体函数)
n:单步调试(逐过程,函数直接执行)
s:单步调试(逐语句:跳入自定义函数内部执行)
fin: 跳出函数
c:从当前位置开始继续运行程序
r:从头开始执行程序
p:打印值及地址
return
:它会跳过当前函数后面的语句直接返回,返回值可以自定义,紧跟在return
命令后面即可
display:追踪查看具体变量值
watch:被设置观察点的变量发生修改时,打印显示
info b:查看断点
delete breakpoints:删除所有断点
delete breakpoints id:删除编号为id的断点
info inferiors :查看进程
info threads :查看线程
thread n(n代表第几个线程,不是线程ID):切换线程
bt : 查看当前线程栈结构
f frameID : 调到指定帧
info frame : 查看当前帧寄存器信息
disassemble : 查看当前帧函数的反汇编代码
thread apply all bt:查看所有线程的堆栈信息
thread apply threadID bt : 查看指定线程堆栈信息
ptype p : 显示变量的类型,如果是一个对象,可以显示数据字段和成员方法,如果我想要真正的类型,必须先设置print对象的变量: set print object on