1. 什么是GDB
GDB 是由 GNU 软件系统社区提供的调试工具,同 GCC 配套组成了一套完整的开发环境,GDB 是 Linux 和许多类 Unix 系统中的标准开发环境。
GDB的四个主要功能:
- 启动程序,可以按照自定义的要求运行程序
- 被调试的程序在所指定的断点处停住(断点可以是条件表达式)
- 当程序被停住时,可以检查此时程序中所发生的事
- 改变程序,将一个 BUG 产生的影响修正从而测试其他 BUG
2. 准备工作
-
生成可执行文件
# '-O0':编译器优化设为0 # '-g': 可执行文件加入源码信息 # '-Wall': warning all gcc -g -O0 -Wall main.c -o main
-
启动调试
gdb main
3. GDB 常用命令
功能 | 命令 | 功能 | 命令 |
---|---|---|---|
退出 | quit | 帮助 | help |
查看主文件代码 | l/ list 行号 l/ list 函数名 | 查看其它文件代码 | l/ list 文件名:行号 l/ list 文件名:函数名 |
设置/获取参数 | set args 10 20 show args | 显示/设置行数 | show list/ listsize set list/ listsize |
设置主文件断点 | b/ break 行号 b/ break函数名 | 设置其他文件断点 | b/ break 文件名: 行号 b/ break 文件名: 函数 |
查看断点 | i/ info b/ break | 删除断点 | d/ del/ delete 断点编号 |
设置断点无效 | dis/ disable 断点编号 | 设置断点生效 | ena/ enable 断点编号 |
设置条件断点 | b/ break 10 if i==5 | 执行至下一个断点前 | c/ continue |
运行GDB程序 | start (停在第一行) run (遇到断点停) | 打印变量[类型] | p/ print 变量名 ptype 变量名 |
向下执行一行 | n/ next 不进入函数体 | 向下单步调试 | s/ step finish (跳出函数体) |
自动变量操作 | display 变量名 i/ info display undisplay 编号 | 其它操作 | set var 变量名=变量值 until (跳出循环) |
4. GDB 多进程调试
使用 GDB 调试的时候,GDB 默认只能跟踪一个进程,可以在 fork 函数调用之前,通过指令设置 GDB 调试工具跟踪父进程或者是跟踪子进程,默认跟踪父进程。
设置调试父进程或者子进程:
set follow-fork-mode [parent| child]
设置调试模式:
set detach-on-fork [on | off]
默认为 on,表示调试当前进程的时候,其它的进程继续运行,如果为 off,调试当前进程的时候,其它进程被 GDB 挂起。
查看调试的进程:
info inferiors
切换当前调试的进程:
inferior id
使进程脱离 GDB 调试:
detach inferiors id
5. GDB 调试段错误
gcc main.c -g -o main
gdb main
run
backtrack