info registers 是首选命令,因其稳定输出所有通用寄存器(rax–r15、rip、rsp、rbp、eflags等),不依赖调试符号,适用于 stripped 二进制或汇编程序,且在崩溃时可捕获瞬间快照。

直接用 info registers 就能看到所有通用寄存器的当前值。它是最常用、最可靠的入口命令,不需要额外条件或前置状态——只要 GDB 已 attach 或 run 到断点,就能执行。
为什么 info registers 是首选命令
这个命令输出稳定、覆盖全(rax–r15、rip、rsp、rbp、eflags 等),且不依赖调试符号(-g 编译选项)。即使你调试的是 stripped 二进制或汇编程序,它照样能工作。
- 输出中
rip表示下一条将执行的指令地址,rsp是栈顶位置,这两个是定位执行流和栈帧的关键 - 如果程序刚崩溃(比如 segfault),GDB 自动停在出错点,此时
info registers显示的就是崩溃瞬间的寄存器快照 - 注意:它默认不显示浮点/SIMD 寄存器(如
xmm0、ymm1),需要额外命令
info all-registers 和 info float 的适用场景
当你怀疑问题出在浮点运算、向量化计算或 AVX 指令上时,仅看通用寄存器不够。
-
info all-registers会补全所有扩展寄存器:浮点控制字、st0–st7、xmm0–xmm15(x86_64)、甚至mxcsr -
info float是轻量替代,只列浮点相关部分(适合快速确认mxcsr是否异常或st0是否为 NaN) - 如果你用
print $xmm0手动查某个 SIMD 寄存器,记得加--format x或--format t控制显示格式,否则可能输出乱码
查单个寄存器别用错命令
想聚焦看 rax 或 rip,别写 print rax——漏掉 $ 符号会报错 No symbol "rax" in current context。
- 正确写法是:
print $rax、print/x $rip(十六进制)、print/t $eflags(二进制位展开) -
info registers rax也能单看rax,但输出格式比print更紧凑,不带格式控制选项 - 修改寄存器值要用
set $rax = 0x100,不是set rax = 0x100;少$会被解释成变量赋值,导致静默失败
寄存器值本身没“对错”,关键是你是否理解它在当前上下文中的含义——比如 rsp 突然远低于正常范围,大概率栈已溢出;rip 指向非法地址,说明控制流已被破坏。这些信号不会自动标红提醒,得靠你对照反汇编(disassemble)和栈帧(info frame)一起读。


















