Linux 命令大全
GDB(GNU Debugger)是 Linux 系统下最常用的程序调试工具,它可以帮助开发者:
- 跟踪程序执行流程
- 设置断点暂停程序运行
- 查看和修改变量值
- 分析程序崩溃原因
- 检查函数调用栈
GDB 支持多种编程语言,包括 C、C++、Objective-C、Fortran、Ada 等,是 Linux 开发者不可或缺的调试利器。
安装 gdb
在大多数 Linux 发行版中,gdb 可以通过包管理器轻松安装:
# Ubuntu/Debian sudo apt-get install gdb CentOS/RHEL sudo yum install gdb Fedora sudo dnf install gdb Arch Linux sudo pacman -S gdb安装完成后,可以通过以下命令验证安装是否成功:
gdb --version编译可调试程序
要使用 gdb 调试程序,需要在编译时添加-g选项生成调试信息:
gcc -g program.c -o program-g选项会在可执行文件中嵌入源代码信息,使 gdb 能够将机器指令与源代码对应起来。
基本 gdb 命令
启动和退出 gdb
# 启动 gdb 并加载程序 gdb ./program 启动 gdb 并附加到正在运行的进程 gdb -p PID 退出 gdb (gdb) quit 或简写 (gdb) q运行程序
# 运行程序 (gdb) run # 或简写 (gdb) r 带参数运行 (gdb) run arg1 arg2断点管理
# 在指定行设置断点 (gdb) break 10 # 或简写 (gdb) b 10 在函数入口设置断点 (gdb) break main (gdb) break function_name 查看所有断点 (gdb) info breakpoints 删除断点 (gdb) delete 1 # 删除编号为 1 的断点 (gdb) delete # 删除所有断点程序执行控制
# 继续执行直到下一个断点 (gdb) continue # 或简写 (gdb) c 单步执行(进入函数) (gdb) step 或简写 (gdb) s 单步执行(不进入函数) (gdb) next 或简写 (gdb) n 执行完当前函数并返回 (gdb) finish查看代码
# 查看当前行附近的代码 (gdb) list # 或简写 (gdb) l 查看指定行附近的代码 (gdb) list 15 查看指定函数的代码 (gdb) list main检查变量和内存
# 打印变量值 (gdb) print variable_name # 或简写 (gdb) p variable_name 修改变量值 (gdb) print variable_name = new_value 查看变量类型 (gdb) ptype variable_name 查看内存内容 (gdb) x/10xw &variable # 以 16 进制查看 10 个字(word)调用栈分析
# 查看调用栈 (gdb) backtrace # 或简写 (gdb) bt 切换到指定栈帧 (gdb) frame 2 或简写 (gdb) f 2高级调试技巧
条件断点
# 当 i 等于 5 时触发断点 (gdb) break 10 if i == 5观察点
# 当变量被修改时暂停 (gdb) watch variable_name 当变量被读取时暂停 (gdb) rwatch variable_name 当变量被读取或修改时暂停 (gdb) awatch variable_name多线程调试
# 查看所有线程 (gdb) info threads 切换到指定线程 (gdb) thread 2 只允许当前线程执行 (gdb) set scheduler-locking on调试核心转储文件
# 加载核心转储文件 gdb ./program core 查看崩溃时的调用栈 (gdb) btgdb 图形界面
gdb 也支持图形界面模式,可以使用-tui选项启动:
gdb -tui ./program或者在使用过程中切换:
(gdb) layout src # 显示源代码窗口 (gdb) layout asm # 显示汇编窗口 (gdb) layout regs # 显示寄存器窗口 (gdb) layout split # 同时显示源代码和汇编实用 gdb 配置
可以将常用配置添加到~/.gdbinit文件中:
# 显示漂亮的打印 set print pretty on 设置历史记录大小 set history save on set history size 1000 自定义命令 define printarray set $i = 0 while $i < $arg0 printf "array[%d] = %d\n", $i, $arg1[$i] set $i = $i + 1 end end常见问题解决
调试时看不到源代码
- 确保编译时使用了
-g选项 - 检查源代码是否在编译时的位置
- 使用
directory命令添加源代码路径:
(gdb) directory /path/to/source调试优化过的代码
优化可能会改变代码执行顺序,使调试变得困难。建议调试时关闭优化:
gcc -O0 -g program.c -o program