jump可直接跳转到指定行执行,如j 21,但会跳过中间代码且不修改栈帧;next按源码行步进不进入函数,finish用于跳出已进入的函数;多线程中无法真正跳过线程执行,只能控制调试视角。

用 jump 跳过某几行代码
当你卡在某处(比如 main.c:18),想直接跳到 main.c:21,跳过中间两行逻辑(如日志打印、临时变量赋值等),jump 是最直接的手段:
- 先确保目标行可执行(不是空行或注释行),且编译时带
-g - 执行
jump 21或简写j 21,程序计数器(PC)会立即指向第 21 行首指令 -
jump不执行跳过的代码,也不改栈帧或寄存器(除 PC 外),但若跳过的是资源释放、锁获取等关键语句,可能引发后续崩溃或死锁 - 跳过去之后若没断点,GDB 会继续运行直到下一个断点或程序结束——所以建议提前在目标行设断点:
b 21再j 21
用 next 和 finish 避免进入函数体
next 本质是“按源码行步进”,它不会进入当前行调用的函数,但仅限于单线程上下文;finish 则用于快速跳出已进入的函数:
- 停在
i = foo();这一行时,用next会执行完foo()并停在下一行,不进其内部 - 如果已经
step进了foo(),又不想逐行看,直接finish即可返回调用点,但注意:它的返回值会真实写回变量(比如foo()返回 42,i就真变成 42) -
next对内联函数、宏展开无效——它们被编译器摊平成多行,next仍是一行一行走
多线程下“跳过”某个线程的业务函数
没有真正能“跳过线程启动”的办法。一旦 std::thread t{business_1}; 执行完,business_1 就已在后台跑起来,你无法让它不执行——你能控制的只有调试视角:
- 别给
business_1设断点;只在共享资源点(如counter::add_one)设断点 - 若误停在里面,用
finish可跳出,但该线程仍在运行,只是你不再单步跟踪它 - 用
set scheduler-locking on冻结其他线程,让next/step只影响当前线程(注意:这不是跳过,是暂停) - 用
thread 1切回主线程再continue,让子线程继续跑,但你不响应它的断点
容易被忽略的关键点
jump 改变的是 PC,不是程序语义。跳过初始化、锁操作、内存分配等代码,极大概率导致后续段错误或未定义行为;多线程中所谓“跳过函数”,实际只是放弃调试那个线程——它照常执行。最稳妥的做法,是编译时加 -g,只在临界区和数据变更点设断点,其余业务路径默认信任、不介入。


















