Printing all global variables/local variables?
如何打印所有全局变量/局部变量?这在GDB中可行吗?
键入info variables以列出"所有全局和静态变量名"。
键入info locals以列出"当前堆栈帧的局部变量"(名称和值),包括该函数中的静态变量。
键入info args以列出"当前堆栈帧的参数"(名称和值)。
- @kennytm,info variables输出中的静态变量名应该是该编译单元中的静态变量,对吗?
- @cpuer:不一定。它只在符号表中显示名称。例如,在mac上使用gcc时,编译时静态变量y被重命名为y.1913。
- @kennytm,函数内部的静态变量是否与函数外部的静态变量(在符号表中)存储的方式相同?
- @cpuer:它们以相同的方式存储,但符号名会有所不同。假设在函数foo中有一个静态变量y,在bar中有另一个y。要区分它们,必须为两个y指定不同的名称。
- @kennytm,更进一步,是否可以分别得到变量的声明和定义位置?
- @cpuer:info var确实显示了为那些具有调试符号的用户定义变量的位置。但不适合当地人。
- @kennytm,似乎错了,Undefined info command:"var". Try"help info".在输入info var之后。
- @cpuer:info var与info variables相同。它至少在GDB6.3上工作…
如果要查看调用函数的局部变量,请在info locals之前使用select-frame。
例如。:
1 2 3 4 5 6 7 8 9 10 11 12 13
| (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) |
- (select-frame可简称sel。或者使用frame/f,也可以打印帧)
此外,由于info locals不显示您所在函数的参数,因此使用
例如:
1 2 3 4
| int main(int argc, char *argv[]) {
argc = 6*7; //Break here.
return 0;
} |
argc和argv不会由info locals显示。消息将是"没有本地人"。
参考:info locals命令。
- 这里有一个真正的参考:sourceware.org/gdb/current/onlinedocs/gdb/frame-info.html