Как получить вывод из gdb.execute в PythonGDB (GDB 7.1)?

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

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

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

Хотя в GDB версии 7.1 кажется, что последний параметр isn ' t доступен, таким образом, эта строка (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?


person Uhlo    schedule 24.01.2012    source источник


Ответы (3)


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

No.

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

person Employed Russian    schedule 25.01.2012

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

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 была намного лучше.

person evolvedmicrobe    schedule 17.08.2014

К вашему сведению (проверено с gdb 8.1) вы можете использовать параметр to_string

https://sourceware.org/gdb/onlinedocs/gdb/Basic-Python.html

gdb.execute (command [, from_tty [, to_string]])

По умолчанию любой вывод, произведенный командой, отправляется на стандартный вывод GDB (и на вывод журнала, если ведение журнала включено). Если параметр to_string имеет значение True, то вывод будет собираться gdb.execute и возвращаться в виде строки. Значение по умолчанию - False, и в этом случае возвращаемое значение - None.

person packmad    schedule 18.12.2019