GDB调试器
计算机行业中,无论软件或硬件领域,所有的逻辑问题或异常统称为BUG
, 排除故障或处置方案称为DEBUG
常见的DEBUG
调试工具主要分为两类, GUI
(可视化调试工具,有图形界面) , GDB
(命令调试工具)
DEBUG
调试工看工具可以让开发者在程序运行时干预, 随心所欲的让程序在任意位置暂停或继续, 暂停时可以设置程序数据或观察程序逻辑, 可以非常方便的查找异常位置,定位错误原因!
两种调试工具的优劣:
GUI(可视化图形调试器)
* 上手较快,使用方便(高度IDE)
* GUI调试工具,开销较大,运行效率较低
GDB(命令调试器)
- 速度快,开销小,兼容性好,冲突异常问题较少
- 上手困难,需要了解掌握一系列的调试命令
Linux下使用GDB调试程序, 程序必须包含调试信息,如果某个app不具备调试信息,那么GDB无法调试。
在程序编译时加入调试信息:
gcc *.c -g -o app #-g选项为加入调试信息
启动调试器/退出调试器
gdb application_name #启动调试器程序
#在调试器中可以通过quit退出gdb程序
quit
q
常用GDB调试命令:
GDB调试命令行具备命令记忆功能, 如果一个命令多次使用,无需键入多次,键入一次而后使用ENTER即可重复。
LIST
代码查看命令
list 行号
list 函数名
#支持简写,例如l 行号或l 函数名
START OR RUN
- start 经典的开始执行调试(默认情况下在main函数暂停,等待调试运行)
- run 开始执行不调试(全速运行)
#如果程序执行时需要外部参数,那么start和run也要传参
start argv1 argv2
run argv1 argv2
#一次调试中,外部参数可以记录并复用,如果退出gdb,再次启动需要重新传参
#run支持简写 r argv1 argv2
NEXT OR STEP
- step 逐语句执行代码
- next 逐过程执行代码
step #支持简写 s
next #支持简写 n
PRINT OR SET VAR
- printf 可以输出显示数据信息,查看变量等等…
- set var 可以在调试时修改变量数据
print *(&var) #支持简写 p var
set var flags=6000 #修改变量的值
break
- break #在指定位置加设断点
- info breakpoints #显示断点列表,详细信息(包含编号)
- delete #根据断点编号删除断点
break 行号 #特定的行加设一个断点
break 函数名 #特定函数加设一个断点
#break支持简写 b 16
info breakpoints #查看断点列表
delete 断点编号 #支持简写 d 断点编号
如果使用的是run执行方式,可以直接跳转到断点位置,如果使用的是start,可以通过continue命令跳转到断点位置。
DISABLE OR ENABLE
- disable 禁用断点
- enable 启用断点
** 如果本次调试不想再某个断点暂停,但是该断点还需要保留,可以使用disable禁用断点**
disable 断点编号
enable 断点编号
TBREAK
- tbreak 临时断点 启动暂停一次立即删除,该断点是临时的。
tbreak 行号 or 函数名
DISPLAY OR UNDISPLAY
- display 设置观察(跟踪观察变量)
- undisplay 取消观察
display var #设置观察成功,观察编号
undisplay 观察编号
跟踪调试父子进程(待写)
跟踪调试多线程(待写)