info locals 仅显示当前栈帧中未被优化的auto局部变量名和值,不包含全局/静态变量或参数;未初始化变量值不可信;结构体和数组显示截断;结果依赖当前线程与栈帧,变量存在列表不保证内存可访问。

info locals 只显示当前栈帧的局部变量名和值
info locals 不会列出全局变量、静态变量或函数参数,只聚焦于当前函数作用域内用 auto 存储类声明的变量(即典型意义上的“局部变量”)。它不关心变量是否已被优化掉——如果编译时用了 -O2 且变量被寄存器完全吸收,info locals 就可能返回空,这不是命令失效,而是变量确实没在栈上分配内存。
变量未初始化时显示的内容不可信
未显式初始化的局部变量(如 int x;)在 info locals 中可能显示为任意值(比如 0x7ffff7ff8000 或 -123456789),这取决于该栈位置之前残留的数据。这种值没有语义意义,不能当作“默认值”理解。若需确认是否真未初始化,应结合 disassemble 看是否有对应赋值指令,或改用 print &x 查地址再用 x/wx &x 观察原始内存。
结构体和数组显示有截断,别全信输出
当局部变量是结构体或大数组时,info locals 默认只展开一级、且对长字段做省略(例如显示 name = "Tom\000\000..." 或 data = {0, 1, 2, ...})。它不递归展开嵌套结构,也不显示全部数组元素。想确认完整内容,得手动用 print 或 x 命令:
-
p stu—— 显示结构体整体(仍可能截断) -
p stu.name—— 单独看成员 -
x/32cb &stu.name—— 按字节查字符数组原始内容
info locals 的输出是“快照式摘要”,不是内存真相的替代品。
线程切换后 info locals 内容立即变化
如果你在多线程程序中调试,info locals 的结果严格绑定于当前选中的线程和栈帧。执行 thread 2 后再运行 info locals,看到的是线程 2 当前栈帧的局部变量,和线程 1 完全无关。常见误操作是切线程后忘了确认 bt 是否还在预期函数里,结果对着错误的栈帧查变量。建议养成习惯:先 thread apply all bt -1 快速扫一眼各线程停在哪,再 thread N 切过去,最后用 info locals。
info locals 列表里,也不能保证它此刻在内存中可访问——比如它可能刚被 move 构造转移走,或生命周期已结束但栈还没覆写。这时候 print 可能报 Cannot access memory at address,而 info locals 还安静地列着它。











