gdb python: ¿Alguien me puede explicar cómo usar este script escrito en esta publicación?

¿Cómo hacerlo por código de ca ..? Es posible..? Leí este post. También quiero hacer cosas similares, pero no puedo usar el script actualizado en el script GDBPython de enlace : cualquier ejemplo que se repita en los campos de estructura C / C ++

Seguí los siguientes pasos para probar: el nombre de mi código fuente era: test.c y pretty.py

gcc -g test.c

gdb test

(gdb) source pretty.py

    (gdb) run

    (gdb) print

    ¿Cómo usar este script?

    Ese script implementa un nuevo comando GDB, wzd que toma una estructura C como argumento. Puedes decir de la cadena de documentos de Python después de la class PrintGList

     """print fields of a struct: wzd struct_object Iterate through the fields of a struct, and display a human-readable form of the objects.""" 

    Esperaba que la secuencia de comandos implementara una impresora GDB bonita para un tipo de datos personalizado y modificara lo que se imprime cuando usa el comando de impresión de GDB, pero no es así como está conectada la secuencia de comandos.

    El nombre de clase PrintGList sugiere que el código se originó a partir de un script que imprimió las listas vinculadas en la biblioteca glib. Copie y pegue huelgas de encoding nuevamente;) He corregido algunos errores menores y he limpiado el siguiente código ( wzd.py ):

     import gdb def _type_is_container(t): return t.code == gdb.TYPE_CODE_STRUCT class WZD(gdb.Command): '''print fields of a struct: wzd struct_object Iterate through the fields of a struct, and display a human-readable form of the objects.''' def __init__(self): gdb.Command.__init__(self, "wzd", gdb.COMMAND_DATA, gdb.COMPLETE_SYMBOL, True) def invoke(self, arg, from_tty): arg_list = gdb.string_to_argv(arg) if len(arg_list) < 1: print "usage: wzd struct" return n = arg_list[0] l = gdb.parse_and_eval(arg_list[0]) (t, m) = (l.type, l.type.tag) print " variable %s " % n, " type %s " % t if l.type.code == gdb.TYPE_CODE_STRUCT: print "Found a struct %s " % n self._print_fields(n, t) else: print "Found no struct" def _print_fields(self, n, typeobject): print typeobject flds = typeobject.fields() for x in flds: sn = n + "." + x.name if _type_is_container(x.type): tag_msg = ', tag: %r' % (x.type.tag,) else: tag_msg = '' print ' field %r type %s (code: %s%s)' % (sn, x.type, x.type.code, tag_msg) if _type_is_container(x.type): print "Found sub level struct %s " % sn sl = gdb.parse_and_eval(sn) sm = sl.type.tag st = sl.type self._print_fields(sn, x.type) def _deep_items (self, type_): for k, v in type_.iteritems(): if k: print " kv %s " % k , " %s " % v else: print " v ", " %s " % v WZD() 

    Progtwig de prueba ( struct-read.c ):

     #include  #include  /* https://github.com/scottt/debugbreak */ #include  struct T { int x, y; }; struct S { struct T t; char b; }; int main() { int r; struct S s; r = scanf("%d%d%c", &s.tx, &s.ty, &s.b); assert(r == 3); debug_break(); return 0; } 

    Muestra de sesión GDB:

     $ echo 1 2 x > in $ gdb -q -x wzd.py struct-read <...> (gdb) run < in <...> Program received signal SIGTRAP, Trace/breakpoint trap. main () at struct-read.c:25 25 } (gdb) wzd s variable s type struct S Found a struct s struct S field 'st' type struct T (code: 3, tag: 'T') Found sub level struct st struct T field 'stx' type int (code: 8) field 'sty' type int (code: 8) field 'sb' type char (code: 8)