【问题标题】:Printing all global variables/local variables?打印所有全局变量/局部变量?
【发布时间】:2011-09-09 19:45:07
【问题描述】:

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

【问题讨论】:

    标签: c variables gdb global-variables


    【解决方案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;
    }
    

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

    参考:info locals command

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多