我通过阅读显示所有全局变量/本地变量的帖子得知,在gdb命令行中可以获取当前帧的所有变量。
我的问题是如何在gdb的Python接口中获取当前帧的所有变量,因为info locals
只会返回字符串结果,这不方便进行进一步的使用。
我通过阅读显示所有全局变量/本地变量的帖子得知,在gdb命令行中可以获取当前帧的所有变量。
我的问题是如何在gdb的Python接口中获取当前帧的所有变量,因为info locals
只会返回字符串结果,这不方便进行进一步的使用。
然而,从Python中很容易迭代本地变量。您可以使用我认为没有办法。 GDB符号表仅部分暴露给Python,我相信无法迭代它们是其中的一个缺陷。
gdb.selected_frame()
获取所选帧。然后,您可以使用block()
方法从帧中获取Block
对象。Block
对象表示一个范围。您可以直接遍历Block
以获取该范围的变量。然后,使用Block.superblock
上升一个作用域。当您遇到具有function
属性的块时,您已进入函数的最外层作用域。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
main.c
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
。
info locals
也会显示父级框架。 - Ciro Santilli OurBigBook.com