ChatGPT解决这个技术问题 Extra ChatGPT

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

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


r
rogerdpack

键入 info variables 以列出“所有全局和静态变量名称”(巨大的列表。

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

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


@KennyTM,info variables 输出中的静态变量名称应该是该编译单元中的静态变量,对吗?
@cpuer:不一定。它只在符号表中显示名称。例如,在 Mac 上使用 gcc 时,静态变量 y 在编译时被重命名为 y.1913
@KennyTM,函数内部的静态变量的存储方式与函数外部的静态变量(在符号表中)的存储方式不同吗?
@cpuer:它们的存储方式相同,但符号名称会有所不同。假设您在函数 foo 中有一个静态变量 y,在 bar 中有另一个 y。为了区分它们,必须为这两个 y 分配不同的名称。
@KennyTM,更进一步,是否有可能获得分别声明和定义变量的位置?
S
Samuel Åslund

如果您想查看调用函数的局部变量,请在 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,它也打印框架)
E
Evgeni Sergeev

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

(gdb) info args

例如:

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

info locals 不会显示 argcargv。消息将是“没有本地人”。

参考:info locals command