【问题标题】:How to access the keys or values of Python GDB Value如何访问 Python GDB Value 的键或值
【发布时间】:2023-03-18 10:17:01
【问题描述】:

我在 GDB 中有一个结构,想运行一个检查这个结构的脚本。在 Python GDB 中,您可以通过

轻松访问结构
(gdb) python mystruct = gdb.parse_and_eval("mystruct")

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

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

有没有可能访问这些信息?我认为您无法访问此信息的可能性很小,但是我在任何地方都没有找到。 dir(mystruct) 告诉我也没有键或值功能。我可以通过打印 mystruct 来查看所有成员,但是没有办法在 python 中获取成员吗?

【问题讨论】:

    标签: python linux gdb


    【解决方案1】:

    来自 GDB documentation:

    你可以像这样得到mystruct的类型:

    tp = mystruct.type
    

    并通过tp.fields() 迭代fields

    不需要邪恶的变通办法;-)

    更新: GDB 7.4 刚刚发布。来自announcement

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

    【讨论】:

      【解决方案2】:

      邪恶的解决方法:

      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']
      

      【讨论】:

      • 感谢您的解决方法!遗憾的是,它不适用于内部带有字符串或其他结构的结构。所以这个解决方案并不总是有效!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多