GDB (GNU Debugger) 是 Linux 下常用的调试工具,用于调试 C/C++ 等程序。以下是常用的 GDB 命令分类整理:
1. 启动和退出
-
启动 GDB
gdb <可执行程序> # 直接启动 gdb --args <程序> <参数> # 带参数启动 gdb -p <PID> # 附加到正在运行的进程 -
退出 GDB
q 或 quit # 退出 GDB
2. 运行程序
-
运行程序
r 或 run # 从头运行程序 r <参数> # 带参数运行(需在启动时未指定参数) -
停止程序
Ctrl + C # 中断程序(暂停在当前位置) kill # 终止程序但不退出 GDB
3. 断点管理
-
设置断点
b 或 break <函数名> # 在函数入口设断点 b <文件名:行号> # 在指定文件的某行设断点 b *<内存地址> # 在内存地址处设断点(用于汇编调试) b <行号> # 在当前文件的某行设断点 -
条件断点
b <位置> if <条件> # 当条件为真时触发断点(如 `b main.c:10 if x==5`) -
查看/删除断点
info b 或 info break # 查看所有断点 delete <断点编号> # 删除指定断点 delete # 删除所有断点 disable/enable <编号> # 禁用/启用断点
4. 单步执行
-
逐行执行
s 或 step # 单步进入(会进入函数内部) n 或 next # 单步跳过(不进入函数) -
继续执行
c 或 continue # 继续运行直到下一个断点 -
逐指令执行(汇编级)
si 或 stepi # 单步进入一条机器指令 ni 或 nexti # 单步跳过一条机器指令
5. 查看代码和变量
-
查看代码
l 或 list # 显示当前行附近的代码 l <函数名> # 显示指定函数的代码 l <文件名:行号> # 显示指定位置的代码 -
查看变量
p 或 print <变量名> # 打印变量值 p/x <变量> # 以十六进制打印 p/d <变量> # 以十进制打印 p/t <变量> # 以二进制打印 p <表达式> # 打印表达式结果(如 `p x+y`) -
自动显示变量
display <变量> # 每次暂停时自动打印变量 undisplay <编号> # 取消自动显示 info display # 查看所有自动显示的变量
6. 调用栈和帧
-
查看调用栈
bt 或 backtrace # 显示当前调用栈(函数调用链) bt full # 显示调用栈及局部变量 -
切换栈帧
frame <编号> # 切换到指定栈帧(如 `frame 2`) up/down # 向上/向下切换栈帧 info frame # 查看当前帧的详细信息
7. 内存和寄存器
-
查看内存
x/<格式> <地址> # 检查内存(如 `x/4xw 0xffff0000`) # 格式:`n`=数量, `f`=格式(x/d/u/t等), `s`=大小(b/h/w/g) -
查看寄存器
info registers # 查看所有寄存器值 p $<寄存器名> # 打印特定寄存器(如 `p $eax`)
8. 线程调试
-
多线程操作
info threads # 查看所有线程 thread <线程ID> # 切换到指定线程 thread apply all <命令> # 对所有线程执行命令(如 `thread apply all bt`)
9. 其他实用命令
-
设置观察点(监控变量修改)
watch <变量> # 当变量被写入时中断 rwatch <变量> # 当变量被读取时中断 -
修改变量值
set var <变量>=<值> # 修改变量值(如 `set var x=10`) -
反汇编
disassemble # 反汇编当前函数 disas <函数名> # 反汇编指定函数 # 设置反汇编风格 set disassembly-flavor intel # 或 att # 设置反汇编下一行指令 set disassemble-next-line on -
GDB 配置
set logging on # 将输出记录到文件(默认 gdb.txt) show args # 查看程序启动参数
10. 调试崩溃程序(Core Dump)
gdb <可执行程序> <core文件> # 分析 core 文件
bt # 查看崩溃时的调用栈
常用组合示例
-
启动并调试
gdb ./my_program b main # 在 main 函数设断点 r # 运行 -
调试崩溃
gdb ./my_program core bt # 查看崩溃位置 -
修改变量继续执行
b 20 # 在行号 20 设断点 r # 运行 p x # 查看变量 x set var x=42 # 修改 x 的值 c # 继续执行
掌握这些命令后,可以覆盖大部分调试场景。更复杂的用法可通过 help <命令> 查看 GDB 内置文档。








网友评论