Как да получите изход от 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)

Последният параметър на тази функция е, че тя трябва да върне резултата като низ (което е напълно логично; защо иначе бих изпълнил такава команда ;) )

Във версия 7.1 на GDB обаче изглежда, че последният параметър не е 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 binary с вашия скрипт. Това ще бъде много по-лесно и по-поддържано решение от предложената от вас алтернатива.

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

FYI сега (тествано с 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