如何访问Python GDB Value的键或值

我在GDB中有一个结构,并想运行一个脚本来检查这个结构。 在Python的GDB中,你可以很容易地通过访问结构

(gdb) python mystruct = gdb.parse_and_eval("mystruct") 

现在我得到了这个名为mystruct的variables,它是一个GDB.Value对象。 我可以通过简单地使用这个对象作为一个字典(如mystruct['member'] )来访问结构的所有成员。

问题是,我的脚本不知道某个结构有哪些成员。 所以我想从这个GDB.Value对象中获得键值(甚至值)。 但是mystruct.values()mystruct.keys()都不能在这里工作。

有没有可能访问这些信息? 我认为你不能访问这些信息的可能性很小,但是我没有在任何地方find它。 dir(mystruct)向我展示了没有键或值的函数。 我可以通过打印mystruct来看到所有的成员,但没有办法让python中的成员?

从GDB 文档 :

你可以像这样获取mystruct的类型:

 tp = mystruct.type 

并通过tp.fields()迭代字段

没有邪恶的解决方法要求;-)

更新: GDB 7.4刚刚发布。 从公告 :

类型对象的结构和联合类型现在允许访问使用标准的Python字典(映射)方法的字段。

邪恶的解决方法:

 python print eval("dict(" + str(mystruct)[1:-2] + ")") 

我不知道这是否一般化。 作为一个演示,我写了一个最小的例子test.cpp

 #include <iostream> struct mystruct { int i; double x; } mystruct_1; int main () { mystruct_1.i = 2; mystruct_1.x = 1.242; std::cout << "Blarz"; std::cout << std::endl; } 

现在我像往常一样运行g++ -g test.cpp -o test并启动gdb test 。 这里是一个会议记录的例子:

 (gdb) break main Breakpoint 1 at 0x400898: file test.cpp, line 11. (gdb) run Starting program: ... Breakpoint 1, main () at test.cpp:11 11 mystruct_1.i = 2; (gdb) step 12 mystruct_1.x = 1.242; (gdb) step 13 std::cout << "Blarz"; (gdb) python mystruct = gdb.parse_and_eval("mystruct_1") (gdb) python print mystruct {i = 2, x = 1.242} (gdb) python print eval("dict(" + str(mystruct)[1:-2] + ")") {'i': 2, 'x': 1.24} (gdb) python print eval("dict(" + str(mystruct)[1:-2] + ")").keys() ['i', 'x']