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

cpu*_*uer 310 c variables gdb global-variables

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

ken*_*ytm 458

键入info variables以列出"所有全局和静态变量名称".

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

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

  • @cpuer:不一定.它仅在符号表中显示名称.例如,在Mac上使用gcc时,静态变量`y`在编译时被重命名为`y.1913`. (3认同)
  • @ KennyTM,`info variables`输出中的静态变量名应该是该编译单元中的静态变量,对吗? (2认同)
  • @cpuer:它们以相同的方式存储,但符号名称将有所不同.假设你在函数`foo`中有一个静态变量`y`而在`bar`中有另一个`y`.要区分它们,必须为两个"y"分配不同的名称. (2认同)

Sam*_*und 100

如果你想看到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) 
Run Code Online (Sandbox Code Playgroud)

  • (`select-frame`可以缩写为`sel`.或者使用`frame` /`f`,它也可以打印框架) (3认同)

Evg*_*eev 24

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

(gdb) info args
Run Code Online (Sandbox Code Playgroud)

例如:

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

argc并且argv不会显示info locals.消息将是"没有当地人".

参考:info locals命令.