info locals 直接列出当前栈帧所有局部变量,依赖-g编译和-O0优化;若显示不全或为空,可能是未加-g、开启优化、变量被寄存器分配或调试信息缺失;需配合print、切换栈帧及手动内存查看定位。

用 info locals 直接列出当前栈帧所有局部变量
这是最直接、最常用的方式。GDB 不会自动显示局部变量,必须显式调用命令。执行 info locals 后,GDB 会扫描当前栈帧(即 frame 0)的调试信息,把编译时带 -g 生成的变量名和当前值一并打印出来。
常见错误现象:运行 info locals 却返回 No symbol table is loaded 或空输出——说明程序没加 -g 编译,或者用了优化选项(如 -O2),导致局部变量被优化掉或符号丢失。
- 确保编译时用了
gcc -g -O0(禁用优化) - 如果变量是寄存器变量(比如循环计数器),
info locals可能显示<optimized out></optimized>,此时需降级优化或改用print强制读取内存地址 - 对结构体或数组,
info locals只显示变量名和类型,不展开内容;要查看值得用print var_name
print 查看单个局部变量的具体值
当 info locals 显示某变量为 <optimized out></optimized>,或你想验证某个变量在特定时刻的内存状态(比如指针是否为空、数组越界前最后一值),就得用 print(简写 p)主动求值。
使用场景包括:
-
p i查看循环变量i当前值 -
p *ptr解引用指针,确认它指向的内容 -
p arr[5]检查数组第 6 个元素(注意越界可能触发 segfault) -
p/x $rbp-0x10手动按栈偏移读取未命名的栈上值(适用于符号缺失但你知道布局的情况)
注意:print 依赖调试信息完整性。若变量完全被优化掉且无栈偏移线索,p 也会报 Cannot access memory 或 No symbol。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
切换栈帧后必须重新执行 info locals
GDB 的 info locals 永远只作用于当前选定的栈帧,不会跨帧生效。比如你用 bt 看到有 3 层调用,用 frame 2 切到 main 帧,再执行 info locals,看到的是 main 的局部变量;切回 frame 0 后,才看到最内层函数的变量。
容易踩的坑:
- 执行
up或down后忘了再敲一次info locals,误以为变量“消失”了 - 用
bt full看到局部变量,就以为它们在所有帧都可访问——其实bt full是 GDB 把各帧的info locals结果拼起来显示的,不能替代手动切换帧 - 递归调用中多个同名变量(如
int n),每个栈帧的n是独立副本,print n总是取当前帧的,不会混淆
为什么有时候 info locals 显示不全?
这不是命令失效,而是底层限制:GDB 只能展示调试信息里明确记录的变量。以下情况会导致“不全”:
- 内联函数里的变量通常不单独建栈帧,也不出现在调用者的
info locals中 - 用
register关键字声明的变量(已废弃)或编译器强干预寄存器分配的变量,几乎必然<optimized out></optimized> - 某些复杂类型(如模板实例化过深的 C++ 对象)可能因调试信息截断而无法完整解析
- 栈帧损坏(如缓冲区溢出覆盖了栈)会导致
info frame都报错,更别说info locals
此时得退一步:用 info registers 和 x/20xg $rsp 手动查栈内存,结合源码和汇编定位变量原始位置——这才是真正需要经验的地方。

















