gdb 常用命令速查
按功能分类整理的 GDB 常用命令速查表,覆盖断点、单步、栈帧、内存查看等日常调试动作,附两个附加进程的实战用法:不进交互界面批量打印线程栈,以及解决 attach 时的 ptrace 权限问题。GDB 接受无歧义的命令前缀,并内置了一批单字母别名(如 d 即 delete、h 即 help),表中「简写」列即常用别名。
命令速查表
| 类别 | 命令 | 简写 | 说明 |
|---|---|---|---|
| 启动与退出 | gdb [可执行文件] | — | 启动 GDB 并加载可执行文件 |
quit | q | 退出 GDB | |
| 运行控制 | run [args] | r | 开始运行程序(可带参数) |
start | — | 启动程序并停在 main 函数开头 | |
continue | c | 继续运行直到下一个断点或结束 | |
kill | — | 终止正在调试的程序 | |
| 断点管理 | break [位置] | b | 在指定位置设断点(函数名、行号、地址等) 例: b main、b file.c:10 |
break [位置] if [条件] | — | 设置条件断点 | |
info breakpoints | i b | 查看所有断点 | |
delete [编号] | d | 删除指定编号的断点(不带编号则删除所有) | |
disable [编号] | — | 禁用断点 | |
enable [编号] | — | 启用断点 | |
| 单步执行 | step | s | 单步进入(会进入函数内部) |
next | n | 单步跳过(不进入函数) | |
finish | — | 执行完当前函数并返回 | |
until [位置] | u | 运行到指定行(常用于跳出循环) | |
| 查看信息 | list [位置] | l | 显示源代码(默认当前行附近) |
print [表达式] | p | 打印变量或表达式的值 | |
display [表达式] | — | 每次停住时自动显示表达式的值 | |
info locals | — | 显示当前作用域的局部变量 | |
info args | — | 显示当前函数的参数 | |
info registers | i r | 显示寄存器内容 | |
| 栈帧操作 | backtrace | bt | 显示调用栈(函数调用链) |
frame [编号] | f | 切换到指定栈帧 | |
up / down | — | 向调用者方向(帧号增大)/ 向被调用方向(帧号减小)移动一帧 | |
| 内存与寄存器 | x/[数量][格式][单位] 地址 | — | 查看内存内容 例: x/10wx 0x1234(10 个十六进制字) |
set variable var = value | — | 修改变量的值 | |
| 其他实用命令 | help [命令] | h | 获取帮助 |
shell [命令] | — | 在 GDB 中执行 shell 命令 | |
set args [参数] | — | 设置程序运行参数(等效于 run 时传参) | |
show args | — | 显示当前设置的程序参数 |
大多数命令支持 Tab 自动补全;
commands [编号]可为断点挂一组自动执行的命令;layout src进入 TUI 模式,分屏显示源码和命令。
附加进程打印全部线程栈
不进入交互界面,一次性抓取目标进程所有线程的调用栈(排查死锁、卡顿时常用):
bash
gdb -batch -ex "thread apply all bt" -p $PID 附加进程的 ptrace 权限问题
Linux(Ubuntu 等发行版)默认开启 Yama 限制,GDB 附加非子进程时会报 ptrace: Operation not permitted。永久放开(降低了安全防护,仅建议在调试机上使用):
bash
# 编辑 sysctl 配置文件
sudo vim /etc/sysctl.d/10-ptrace.conf
# 修改为
kernel.yama.ptrace_scope = 0
# 应用配置
sudo sysctl -p /etc/sysctl.d/10-ptrace.conf 临时放开(重启失效):
bash
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope 要点
- 断点看
i b、删断点d N、条件断点break ... if cond,三个组合覆盖大部分断点需求 - 排查崩溃先
bt看调用栈,再f N切帧、info locals看现场 - 附加线上进程优先用
gdb -batch -ex "thread apply all bt" -p PID,一次输出全部线程栈,侵入最小