Как получить доступ к ключам или значениям Python GDB Value - PullRequest
4 голосов
/ 18 января 2012

У меня есть структура в GDB, и я хочу запустить скрипт, который проверяет эту структуру. В Python GDB вы можете легко получить доступ к структуре через

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

Теперь я получил переменную mystruct, которая является объектом GDB.Value. И я могу получить доступ ко всем членам структуры, просто используя этот объект в качестве словаря (например, mystruct['member']).

Проблема в том, что мой скрипт не знает, какие члены имеет определенная структура. Поэтому я хотел получить ключи (или даже значения) из этого объекта GDB.Value. Но ни mystruct.values(), ни mystruct.keys() здесь не работают.

Нет ли возможности получить доступ к этой информации? Я думаю, что маловероятно, что вы не можете получить доступ к этой информации, но я нигде не нашел ее. A dir(mystruct) показал мне, что также нет функции ключей или значений. Я могу увидеть всех участников, напечатав mystruct, но разве нет способа получить членов в python?

Ответы [ 2 ]

4 голосов
/ 18 января 2012

Из документации GDB :

Вы можете получить тип mystruct, например, так:

tp = mystruct.type

и перебирать поля через tp.fields()

Злые обходные пути не требуются; -)

Обновление: GDB 7.4 только что был выпущен. Из объявления :

Объекты типов для типов struct и union теперь разрешают доступ к поля с использованием стандартных методов словаря (отображения) Python.

1 голос
/ 18 января 2012

Злой обходной путь:

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