如何打印所有全局变量/局部变量?在gdb中可以吗?

#1 楼

键入info variables列出“所有全局和静态变量名称”。

键入info locals列出“当前堆栈帧的局部变量”(名称和值),包括该函数中的静态变量。

键入info args以列出“当前堆栈框架的参数”(名称和值)。

评论


@KennyTM,信息变量输出中的静态变量名称应该是该编译单元中的静态变量,对吗?

–cpuer
2011年6月7日7:09

@cpuer:不一定。它仅在符号表中显示名称。例如,在Mac上使用gcc,静态变量y在编译时重命名为y.1913。

–kennytm
2011年6月7日7:14

@KennyTM,函数内部的静态变量是否与函数外部的静态变量(在符号表中)存储的方式相同?

–cpuer
2011年6月7日7:20

@cpuer:它们的存储方式相同,但是符号名称会有所不同。假设您在函数foo中有一个静态变量y,在bar中有另一个y。为了区分它们,必须为两个y分配不同的名称。

–kennytm
2011年6月7日下午7:41

@KennyTM,还有,能否分别声明和定义变量?

–cpuer
2011年6月7日7:53

#2 楼

如果要查看调用函数的局部变量,请在select-frame之前使用info locals

例如:

(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) 


评论


(选择框架可以缩写为sel。或者使用frame / f,它也可以打印框架)

–user202729
18年5月19日在7:59

#3 楼

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

(gdb) info args


例如:

int main(int argc, char *argv[]) {
    argc = 6*7;    //Break here.
    return 0;
}


argc不会显示argvinfo locals。该消息将为“无本地人。”

参考:info locals命令。

评论


一个真正的参考在这里:sourceware.org/gdb/current/onlinedocs/gdb/Frame-Info.html

– JohanBoulé
19年3月17日在13:12