关键调试方法是until跳转、display自动打印和条件断点;until运行至指定行或栈帧结束,display每次暂停自动输出变量值,条件断点按需触发,三者需结合list确认结构后使用。

在循环里单步查看每次变化,关键不是靠 next 硬拖,而是用 until 或配合条件断点 + display,否则容易漏掉迭代中间态或卡在死循环里。
用 until 跳到循环末尾再回退观察
循环体有多行、又不想逐行 next(尤其内层还有函数调用时),until 是最直接的解法。它会运行到指定行号(或当前栈帧结束),常用于“跳过本次循环体,停在循环判断前”。
-
until 15:运行到第 15 行(比如for的条件判断行),适合已知循环控制语句位置 -
until(不带参数):运行到当前源文件中下一个不同行号,对简单单行循环头也有效 - 注意:
until不是“执行一次循环”,而是“运行到某一行”,如果循环条件永远为真,它会一直跑下去——所以务必先确认循环有退出路径
用 display 自动打印变量,避免手动 print 忘记
手动每步敲 print i print sum 容易漏、手酸,且无法回溯。用 display 可让 GDB 每次暂停时自动输出指定表达式:
-
display i:每次停顿时显示变量i的当前值 -
display /x &i:同时显示i的地址和十六进制值,验证是否被优化掉或地址变动 -
undisplay 2:取消编号为 2 的自动显示项(用info display查编号) - 陷阱:如果变量被编译器优化(如未加
-g -O0),display可能报No symbol "i" in current context—— 此时必须重新编译:gcc -g -O0 -o prog prog.c
在循环条件处设条件断点,只停特定迭代
想只看第 5 次循环、或 i == 100 时的状态?硬等太傻,用条件断点:
-
break 12 if i == 5:在第 12 行(比如for大括号后或printf行)设置触发条件 -
condition 1 i > 10:给已有断点 1 追加条件(用info breakpoints看编号) - 性能提示:条件断点每次都会求值,若条件复杂(如调用函数),可能显著拖慢调试;纯变量比较无影响
- 常见错误:写成
break 12 if i=5(少了个=),GDB 会静默当作赋值,断点永远不触发
真正难的不是命令怎么输,而是你得清楚“我想确认的是循环变量本身,还是它参与计算的中间结果,抑或内存布局是否被破坏”。until 和 display 解决节奏问题,条件断点解决目标问题——三者混用前,先用 list 确认循环结构,比盲目单步重要得多。











