打印所有全局变量/局部变量?
Posted
技术标签:
【中文标题】打印所有全局变量/局部变量?【英文标题】:Printing all global variables/local variables? 【发布时间】:2011-09-09 19:45:07 【问题描述】:如何在 gdb 中可以吗?
【问题讨论】:
【参考方案1】:键入 info variables
以列出“所有全局和静态变量名称”。
键入 info locals
以列出“当前堆栈帧的局部变量”(名称和值),包括该函数中的静态变量。
键入 info args
以列出“当前堆栈帧的参数”(名称和值)。
【讨论】:
@KennyTM,info variables
输出中的静态变量名称应该是该编译单元内的静态变量,对吧?
@cpuer:不一定。它只在符号表中显示名称。例如,在 Mac 上使用 gcc 时,静态变量 y
在编译时重命名为 y.1913
。
@KennyTM ,函数内部的静态变量的存储方式与函数外部的静态变量(在符号表中)的存储方式不同吗?
@cpuer:它们的存储方式相同,但符号名称会有所不同。假设您在函数foo
中有一个静态变量y
,在bar
中有另一个y
。为了区分它们,必须为这两个y
分配不同的名称。
@KennyTM ,更进一步,是否有可能获得分别声明和定义变量的位置?【参考方案2】:
如果您想查看调用函数的局部变量,请在 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)
【讨论】:
(select-frame
可以简写为sel
。或者使用frame
/f
,也可以打印框架)【参考方案3】:
此外,由于info locals
不显示您所在函数的参数,请使用
(gdb) info args
例如:
int main(int argc, char *argv[])
argc = 6*7; //Break here.
return 0;
argc
和 argv
不会被 info locals
显示。消息将是“没有本地人”。
参考:info locals command。
【讨论】:
真正的参考在这里:sourceware.org/gdb/current/onlinedocs/gdb/Frame-Info.html以上是关于打印所有全局变量/局部变量?的主要内容,如果未能解决你的问题,请参考以下文章