gdb 是 Linux 下的命令行调试器,info registers 能一次列出当前线程所有 CPU 寄存器的值,用来判断程序停在哪儿、参数和返回值放在哪个寄存器。
编译时加 -g 并关掉优化,载入 gdb 后下断点运行,停下后直接查寄存器。看单个寄存器用 p/x $寄存器名,看当前指令用 x/i $pc。
# demo.c 内容:int main(){int a=1;return a;}
gcc -g -O0 demo.c -o demo # 保留调试信息,关闭优化
gdb ./demo # 进入 gdb
break main # 在 main 下断点
run # 运行到断点
info registers # 列出全部寄存器
p/x $pc # 十六进制看程序计数器
x/3i $pc # 看 pc 附近三条汇编指令
坑一:用 -O2 编译后变量可能被优化掉或塞进寄存器,看到的寄存器和源码对不上,调试时先用 -O0。坑二:多线程程序里 info registers 只显示当前线程,切到目标线程要先 thread 再查。