i args可一次性列出当前函数所有参数名及值,不依赖变量是否优化,只要符号表完整(编译带-g);但需确保断点停在函数体内部,且注意其默认不自动解引用字符串指针。

用 i args 一次性列出所有参数
程序停在函数内部断点时,i args(等价于 info args)会直接打印当前函数所有参数名及其值,包括 main 的 argc 和 argv。它不依赖变量是否优化掉,只要符号表完整(编译带 -g),就能识别形参。
常见错误是断点没停准——比如断在函数调用前或已返回,此时执行 i args 会报错 No symbol table is loaded 或显示空。务必确认 GDB 提示的停靠位置确实是目标函数体内部(如 fun_test (a=10, str=0x555555554b21 "test") at demo.cpp:6 这类输出)。
注意:该命令只显示“当前栈帧”的参数,切换栈帧(up/down)后需重新执行才能看到对应层的参数。
用 p 单独查看某个参数值
p a、p argv[1] 这类写法更灵活,适合快速验证某个具体参数,也支持表达式计算(如 p argc > 1 返回 $1 = 1)。但前提是变量名必须在当前作用域可见——如果编译时启用了 -O2 且未加 -g3,部分参数可能被优化进寄存器而无法直接用名访问。
此时可配合寄存器查看:info registers 查看通用寄存器(rdi, rsi, rdx 等),再用 p /d $rdi 解析整数参数;字符串指针则常用 x/s $rsi 查内存内容。
不要依赖 p 显示结构体参数的完整布局——它默认只展开一层。想看深层成员(如 struct node *n 的 n->next->val),得手动写路径,或先用 ptype n 确认类型定义。
为什么 i args 有时不显示字符串内容?
这是 GDB 默认行为:对 char 指针,i args 只显示地址(如 str=0x555555554b21),不自动解引用为字符串。这不是 bug,而是避免意外读取非法内存。
要看到实际字符串,两种办法:
-
p str—— 如果 str 是char *且指向有效内存,GDB 通常会自动以"test"形式显示 -
x/s str—— 强制按字符串格式解析地址处内容,更底层、更可控
若字符串显示一堆乱码或截断(如 "hello\000\000\000..."),说明缓冲区有填充字节。此时执行 set print null-stop on,后续所有 p 和 i args 都会在首个 \0 处停止输出。
查看参数时容易忽略的编译影响
参数能否被正确识别,高度依赖编译选项:
- 必须带
-g(推荐-g3),否则i args可能完全失效 - 开启优化(
-O1及以上)后,简单参数(如int a)常被放入寄存器而非栈,i args仍能显示,但p &a会报错 “can't take address” - 使用
std::string等复杂类型时,i args可能只显示对象地址,需p *str或p str.c_str()才能看到内容
最稳妥的做法:调试阶段统一用 gcc -g3 -O0 编译。上线前再切回优化版本,但别指望用同一套 GDB 命令无差别调试。











