打印所有全局变量/局部变量?

430

我该如何打印所有的全局变量/局部变量?在gdb中是否有可能实现?

3个回答

615

输入命令info variables来列出“所有全局变量和静态变量名称”(列表很长)。

输入命令info locals来列出“当前堆栈帧的本地变量”(包括该函数中的静态变量)的名称和值。

输入命令info args来列出“当前堆栈帧的参数”(名称和值)。


3
@KennyTM,在info variables命令的输出中,静态变量名称应该是在该编译单元内的静态变量,对吗? - cpuer
4
不一定。它只在符号表中显示名称。例如,在Mac上使用gcc编译时,静态变量y会被重命名为y.1913 - kennytm
3
它们被存储的方式相同,但符号名称将不同。考虑在函数foo中有一个静态变量y,在bar中还有另一个y。为了区分它们,必须为这两个y赋予不同的名称。 - kennytm
1
@cpuer:info var 可以显示变量在哪里被定义,但对于本地变量则不行。 - kennytm
1
@KennyTM,看起来有问题,输入“info var”后出现“Undefined info command: "var"。请尝试输入“help info”。 - cpuer
显示剩余5条评论

147
如果您想查看调用函数的本地变量,请在使用info locals之前使用select-frame
例如:
(gdb) bt
#0  0xfec3c0b5 in _lwp_kill () from /lib/libc.so.1
#1  0xfec36f39 in thr_kill () from /lib/libc.so.1
#2  0xfebe3603 in raise () from /lib/libc.so.1
#3  0xfebc2961 in abort () from /lib/libc.so.1
#4  0xfebc2bef in _assert_c99 () from /lib/libc.so.1
#5  0x08053260 in main (argc=1, argv=0x8047958) at ber.c:480
(gdb) info locals
No symbol table info available.
(gdb) select-frame 5
(gdb) info locals
i = 28
(gdb) 

7
select-frame 可以缩写为 sel。或者可以使用 frame/f,它们也会打印框架。 - user202729

33

另外,由于info locals不会显示你所在函数的参数,请使用

(gdb) info args
例如:
int main(int argc, char *argv[]) {
    argc = 6*7;    //Break here.
    return 0;
}

info locals命令不会显示argcargv,它会显示消息"No locals."

参考: info locals command.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接