基本命令整理
2026/10/20大约 5 分钟
基本命令整理
一、启动调试与程序执行
1. 传递程序参数
| 方法 | 命令 | 适用场景 |
|---|---|---|
| 启动时传参 | gdb --args ./exe 1 2 "3 4",然后 run | 固定参数调试,首选 |
| 进入 GDB 后设置 | gdb ./exe → set args 1 2 "3 4" → run | 需要反复修改参数 |
| 直接跟参数运行 | gdb ./exe → run 1 2 "3 4" | 临时测试,最简洁 |
注意:
- 多个参数用空格分隔。
- 参数本身含空格时,用引号包裹,如
"3 4"。 run后的参数每次都要重新输入。
选择建议:
- 固定参数:
gdb --args - 动态改参:
set args+run - 临时测试:
run <args>
2. 附加到正在运行的进程
适用场景:程序已经在运行,不方便重新启动调试。
获取 PID:
ps aux | grep sec
# 或
pgrep 进程名附加方式:
gdb -p <pid>
# 或进入 gdb 后
(gdb) attach <pid>原笔记写作 gdb attach <pid>,实际更常用的是 gdb -p <pid>,或先启动 gdb 再执行 attach <pid>。
附加后:
- 程序会自动暂停。
- 可查看源码、设置/删除断点、查看变量、单步执行。
- 可用
continue/c恢复运行,遇到断点再次暂停。 - 示例:附加到
section2班车管理系统后,程序暂停在read系统调用处。 - 可在
order_bus函数处设断点,如section2.cpp第 237 行。
退出方式:
detach:分离调试,程序继续运行。quit/q:退出 GDB,程序被终止。- 如果程序自己退出,调试会话也会自动结束。
二、单步执行
1. 逐过程执行:next / n
含义:step-over,跳过函数调用,不进入函数内部。
行为:
- 当前行没有函数调用:执行完当前行,走到下一行。
- 当前行有函数调用:把整个函数调用当成一步执行完,不进入函数。
- 适合调试时跳过已知正确的函数。
示例:
if (number + ordered_bus_number > total_bus())在 order_bus 第 241 行使用 n:
- 会跳过
total_bus()函数。 - 输入
20后,程序直接输出“预定班车失败”。 p number可看到值为20。ordered_bus_number为0,所以条件判断为真。
2. 逐语句执行:step / s
含义:step-into,进入函数调用内部,停在函数第一行。
行为:
- 遇到函数会进入函数内部。
- 如果函数内部没有其他函数调用,
s和n效果相同。 - 可连续使用
s逐步执行函数内部代码。 - 适合需要调试函数内部逻辑时。
示例:
- 同样在
if语句处使用s,会进入total_bus()函数内部。 - 进入后继续用
s单步执行。 - 最后可用
c继续运行到结束。
3. next 与 step 区别
| 命令 | 别名 | 遇到函数调用 |
|---|---|---|
next | n | 跳过函数,不进入内部 |
step | s | 进入函数内部,停在第一行 |
三、退出当前函数:finish
作用:执行完当前函数的剩余代码,返回到调用该函数的下一行。
效果:
- 立即完成当前函数剩余逻辑。
- 显示函数返回值,例如
$1 = 0。 - 跳回调用处,例如跳回
if条件判断语句。
适用场景:
- 已确认当前函数前半部分逻辑正确。
- 想跳过剩余代码,快速回到调用点。
示例:
- 在
total_bus()内部确认班车数量为0后,使用finish直接返回调用处。
四、退出调试
| 方式 | 命令 | 效果 | 适用场景 |
|---|---|---|---|
| 分离 | detach | 保留被调试程序运行,只结束 GDB 控制 | 生产环境、需要程序继续跑 |
| 退出 | quit / q | 完全终止被调试程序并退出 GDB | 调试完成,不再需要程序 |
区别:
detach后程序继续运行,但不能再设断点、单步执行。quit会提示Inferior 1 [process ...] will be killed,程序被终止。detach通常无特殊提示。quit会显示进程终止确认提示。
五、示例练习:班车管理系统 section2
建议练习:
- 获取示例代码
section2.cpp。 - 在
order_bus函数设置断点。 - 在
if (number + ordered_bus_number > total_bus())处:- 用
n观察跳过total_bus()。 - 用
s观察进入total_bus()。 - 用
finish从total_bus()返回调用点。
- 用
- 对比
detach和quit的实际效果。 - 在
main函数设置断点,测试退出方式。
六、课后练习
GDB 调试基本操作:
- 启动调试
- 附加进程
- 逐语句执行
step/s - 逐过程执行
next/n - 退出函数
finish - 退出调试
detach/quit
下节课预告:
- 重点讲解 GDB 断点设置命令。
- 学习目标:掌握各种类型的断点设置。
七、知识小结表
| 知识点 | 核心内容 | 考试重点 / 易混淆点 | 难度 |
|---|---|---|---|
| GDB 参数传递 | 三种方法:gdb --args;set args + run;run <参数> | set args 与直接 run 传参的适用场景 | ⭐⭐ |
| 附加到进程调试 | attach <PID>;gdb -p <PID> | attach 与 -p 功能等价 | ⭐⭐ |
| 单步执行命令 | next 逐过程,step 逐语句 | n 跳过函数,s 进入函数 | ⭐⭐⭐ |
| 退出调试方式 | detach 分离,程序继续跑;quit 终止程序 | detach 保持状态,quit 强制终止 | ⭐ |
| 断点与函数控制 | finish 退出当前函数并返回调用点 | finish 与 continue 的流程控制差异 | ⭐⭐⭐ |
八、命令速查
gdb --args ./exe 1 2 "3 4" # 启动时传参
set args 1 2 "3 4" # GDB 内设置参数
run / r # 运行
run 1 2 "3 4" # 直接带参运行
gdb -p <pid> # 附加到进程
attach <pid> # GDB 内附加
detach # 分离,程序继续运行
quit / q # 退出并终止程序
next / n # 逐过程,跳过函数
step / s # 逐语句,进入函数
finish # 执行完当前函数并返回
continue / c # 继续运行九、一句话记忆
n:跳过函数,看整体。s:进入函数,看细节。finish:函数不想看了,直接返回调用点。detach:放过程序,让它继续跑。quit:结束程序,退出调试。

