2012-01-24 14 views
6

Actualmente estoy escribiendo un script de Python GDB. El problema es que tiene que ser compatible con GDB 7.1. Así que empecé a escribir el guión de GDB 7.3.1 y se utiliza la siguiente función para recibir la salida de un comando gdb (BGF 7.3.1):¿Cómo obtener salida de gdb.execute en PythonGDB (GDB 7.1)?

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

El último parámetro de esta función es que debe devolver el resultado como una cadena (que hace perfectamente sentido, ¿por qué si no iba a ejecutar un comando;))

En BGF versión 7.1 aunque parece que el último parámetro isn't available por lo tanto esta línea (GDB 7.1):

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

devuelve None.

¿Hay alguna posibilidad de recuperar la salida de este comando? Ya traté de redireccionar la salida estándar de mi script python a un archivo y luego cargar este archivo, pero aparentemente la entrada y salida estándar de mi script python es overwritten by the gdb environment, por lo que el resultado del comando gdb.execute no se escribe en mi archivo.

Lo único que se me ocurre ahora es ajustar mi script con un script bash que primero abre gdb con un script python que ejecuta varios comandos y luego canaliza eso en un archivo. A continuación, vuelva a abrir gdb pero con otra secuencia de comandos python que carga el archivo, lo analiza y luego ejecuta otros comandos según la entrada del archivo, y así sucesivamente. Pero esta es realmente la solución más fea que se me ocurre.

¿Hay alguna manera de recibir la salida de un gdb.execute en GDB 7.1?

Respuesta

5

¿Hay alguna manera de recibir la salida de un gdb.execute en GDB 7.1?

Su mejor opción es hacer arreglos para GDB-7.3 a estar disponible. Como GDB no suele utilizar bibliotecas compartidas (más allá de libc y quizás de libpython), puede copiar gdb binary con su script. Esa será una solución mucho más fácil y más fácil de mantener que la alternativa que usted propuso.

2

Usted puede escribir en un archivo, y luego leer el archivo, por ejemplo:

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() 

La versión antigua de gdb.execute era muy superior embargo.