info args 是查看当前栈帧函数参数最直接可靠的方式,需确保编译时加 -g 且未优化;失效时可查寄存器(如 %rdi)或 arglist 地址处的栈内存,跨帧需先 frame 切换。

用 info args 直接看当前栈帧的函数参数
这是最直接、最可靠的方式。GDB 在符号信息完整(即编译时加了 -g)的前提下,能准确解析出当前栈帧中传入的实参值。info args 不依赖你是否记得变量名,也不需要手动查寄存器或内存地址,它直接按函数声明顺序列出所有参数及其值。
常见错误现象:运行 info args 后显示 No arguments. 或只显示部分参数——大概率是没在函数入口处停住,或者编译时没带 -g,导致调试信息缺失。
- 确保程序用
gcc -g编译,例如:gcc -g -o test test.c - 在目标函数第一行设断点,比如
break func1,再run,这样停在函数刚进入、参数已加载但局部变量可能还未初始化的位置 - 如果函数是内联的或被优化掉(如用了
-O2),info args可能失效;务必关闭优化:gcc -g -O0
当 info args 失效时,查寄存器或栈内存
64 位 Linux(x86_64)下,前 6 个整型/指针参数依次放在 %rdi、%rsi、%rdx、%rcx、%r8、%r9;浮点参数走 %xmm0–%xmm7。超过 6 个的参数会压栈(在调用者的栈帧里),需结合 info frame 看栈基址再偏移读取。
容易踩的坑:直接 x/4xw $rsp 往往看不到参数,因为栈顶可能已被函数 prologue(如 push %rbp、sub <p>容易踩的坑:直接 <code>x/4xw $rsp 往往看不到参数,因为栈顶可能已被函数 prologue(如 push %rbp、sub $0x10,%rsp)改写;正确做法是先用 info frame 找到 Save registers: 区域或 Arglist at 提示的地址,再从那里开始查。
info frame 找到 Save registers: 区域或 Arglist at 提示的地址,再从那里开始查。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 执行
info frame,关注输出中类似Arglist at 0x7fffffffe3a0, args: int a, int b, int c的行 - 若没显式给出
Arglist at,用info registers rdi rsi rdx rcx r8 r9查前 6 个 - 对第 7 个及以后的参数,用
x/4xw 0x7fffffffe3a0+24这类偏移(具体偏移量取决于参数类型和对齐)
backtrace full 能顺带看到部分参数,但不全也不稳定
bt full 会在每个栈帧行末括号里打印识别出的参数值,比如 #0 func1 (a=10) at test.c:5。但它依赖符号表质量与 GDB 解析能力,对复杂类型(结构体、数组)、优化后代码或无调试信息的二进制基本无效。
性能影响几乎为零,但别把它当主力方案——它只是辅助线索,不是权威来源。真要确认参数值,还是回到 info args 或寄存器/内存查证。
- 仅用于快速扫一眼“大概传了啥”,尤其在崩溃后用
gdb ./prog core加载 core 文件时 - 若括号里显示
a=<optimized out></optimized>,说明该参数被编译器优化掉了,此时必须关优化重编译才能看到 - 不要依赖它判断指针指向的内容,它只显示指针本身的值(如
buf=0x7fffffffe420),不展开内存
跨栈帧查看其他函数的参数要用 frame 切换
每个栈帧独立保存自己的参数和局部变量。info args 永远只作用于当前帧。想看 func2 调用 func1 时传了什么,得先 up 切到 func2 帧,再 info args。
容易忽略的关键点:调用链越深,帧编号越大(frame 0 是当前,frame 1 是它的调用者),但 up 是向上走(往调用者方向),down 是向下走(往被调用者方向)——这个方向和编号数字增减是反的,新手常搞混。
- 用
bt先看清调用链层级和帧编号 - 用
frame 2或up 2快速跳转,比连按多次up更稳 - 切帧后务必再执行一次
info args,别假设上一帧的结果还有效










