Как получить вывод из gdb.execute в PythonGDB (GDB 7.1)? - PullRequest
6 голосов
/ 24 января 2012

В настоящее время я пишу скрипт Python GDB. Проблема в том, что он должен быть совместим с GDB 7.1. Поэтому я сначала написал скрипт для GDB 7.3.1 и использовал следующую функцию для получения вывода команды gdb (GDB 7.3.1):

myvar = gdb.execute("info target", False, True)

Последний параметр этой функции заключается в том, что она должна возвращать результат в виде строки (что вполне логично; зачем мне выполнять такую ​​команду;))

В GDB версии 7.1, хотя кажется, что последний параметр недоступен , таким образом, эта строка (GDB 7.1):

myvar = gdb.execute("info target", False)

возвращает None.

Есть ли шанс получить выходные данные этой команды? Я уже пытался перенаправить стандартный вывод моего скрипта python в файл, затем загружал этот файл, но, очевидно, стандартный ввод и вывод моего скрипта python перезаписан средой gdb , поэтому вывод из gdb. команда execute не записывается в мой файл.

Единственное, о чем я мог подумать сейчас, - это обернуть мой сценарий сценарием bash, который сначала открывает GDB сценарием Python, выполняющим различные команды, а затем передает его в файл. Затем снова откройте GDB, но с помощью другого скрипта Python, который загружает файл, анализирует его, а затем выполняет другие команды на основе ввода из файла и так далее. Но это действительно самое уродливое решение, которое я могу придумать.

Так есть ли способ получить выходные данные gdb.execute в GDB 7.1?

Ответы [ 2 ]

5 голосов
/ 25 января 2012

Так есть ли способ получить выходные данные gdb.execute в GDB 7.1?

номер

Лучше всего организовать доступность GDB-7.3. Поскольку GDB обычно не использует разделяемые библиотеки (помимо libc и, возможно, libpython), вы можете просто скопировать двоичный файл gdb с помощью своего скрипта. Это будет намного проще и более приемлемым решением, чем предложенная вами альтернатива.

2 голосов
/ 17 августа 2014

Вы можете записать в файл, а затем прочитать файл, например:

os.system("rm tmp.txt")
gdb.execute("set logging file tmp.txt")
gdb.execute("set logging on")
mainsec=gdb.execute("info proc mappings")
gdb.execute("set logging off")
mainsec = open("tmp.txt").read()

Старая версия gdb.execute была намного лучше.

...