繁体   English   中英

获取gdb的python接口中的所有全局变量/局部变量

[英]Get all global variables/local variables in gdb's python interface

我通过阅读打印所有全局变量/局部变量一文了解到,我们可以在 gdb 的命令行中获取当前帧的所有变量。

我的问题是如何在 gdb 的 python 接口中获取当前帧的所有变量,因为info locals只是以字符串形式给出结果,这不方便进一步使用。

问题变了吗? 我不确定,但我怀疑是因为我之前的答案非常错误。 我依稀记得这个问题曾经是关于全局变量的,在这种情况下,这是真的:

我不认为有办法。 GDB 符号表仅部分暴露于 Python,我认为缺乏迭代它们的能力是漏洞之一。

但是,从 Python 迭代局部变量很容易。 您可以使用gdb.selected_frame()来获取选定的框架。 然后,您可以从框架中使用block()方法获取Block对象。

Block对象代表一个范围。 您可以直接遍历Block以从该范围中获取变量。 然后,使用Block.superblock上升一个范围。 当您命中具有function属性的块时,您已经命中了函数的最外层作用域。

这显示了如何根据 Tom 的建议列出所有当前可见的变量(一次)。

它只显示当前文件中定义的全局变量,因为正如 Tom 所提到的,目前无法访问其他文件中定义的全局变量。

我们将我们看到的名字存储在一个集合中,并在块树上上升。

请注意, info locals在父框架上显示阴影变量。 要显示这些,只需删除set检查。

主文件

gdb.execute('file a.out', to_string=True)
gdb.execute('break 10', to_string=True)
gdb.execute('run', to_string=True)
frame = gdb.selected_frame()
block = frame.block()
names = set()
while block:
    if(block.is_global):
        print()
        print('global vars')
    for symbol in block:
        if (symbol.is_argument or symbol.is_variable):
            name = symbol.name
            if not name in names:
                print('{} = {}'.format(name, symbol.value(frame)))
                names.add(name)
    block = block.superblock

主文件

int i = 0;
int j = 0;
int k = 0;

int main(int argc, char **argv) {
    int i = 1;
    int j = 1;
    {
        int i = 2;
        i = 2; /* Line 10. Add this dummy line so above statement takes effect. */
    }
    return 0;
}

用法:

gcc -ggdb3 -O0 -std=c99 main.c
gdb --batch -q -x main.py

输出:

i = 2
argc = 1
argv = 0x7fffffffd718
j = 1

global vars
k = 0

如果您还需要enum字段之类的常量,也可以使用symbol.is_constant

在 Ubuntu 14.04、GDB 7.7.1、GCC 4.8.4 上测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM