2011-12-20 9 views
5

Estoy tratando de utilizar las bonitas instalaciones de impresión de GDB para mostrar una clase de matriz C++ personalizada.gdb impresión bonita con llamadas a funciones directas

La clase es bastante estándar que puede encontrar en cualquier lugar. Es una plantilla parametrizada por el tipo, y se puede acceder con notación tipo C como mat [i] [j]. Esto primero devuelve implícitamente otra plantilla de la clase "Slice" que representa una fila o una columna, a la que el operador [] puede acceder nuevamente para extraer los datos. La clase en sí está utilizando una matriz C simple para almacenamiento, pero está implementando algunos trucos sobre ella, como una opción de asignar previamente una matriz más grande, permitir inicios distintos de cero, usar zancadas, etc. La clase no tiene una impresión nativa interfaz, y no puedo modificarlo o vincularlo con mi propio código fácilmente.

Las funciones personalizadas dificultan la reproducción del código de acceso directo a datos en Python. ¿Pero es eso necesario? En general, ¿por qué la impresión bonita debería reproducir la lógica del acceso a los datos? ¿No puedo usar las llamadas de C++ y usar los operadores [] para imprimir el elemento i, j-ésimo? El hecho de que la clase Slice sea temporal en GDB durante dicha solicitud complica aún más esto.

También soy bastante principiante con los scripts de python y GDB. Intenté hackear los ejemplos para reemplazar el acceso a datos con llamadas gdb.execute, pero no tengo idea de cómo acceder al nombre del objeto desde la función to_string, así que puedo usar algo como gdb.execute (??? + '[] + str (i) + ']', Falso, Verdadero).

Me pregunto cuál es la forma más efectiva de hacerlo.

Respuesta

5

¿No puedo simplemente usar las llamadas de C++ y usar los operadores [] para imprimir el elemento i, j-ésimo?

Usted puede llamar desde el bonito-impresora en el proceso inferior (que se está depurando) usando gdb.parse_and_eval (docs), pero esto tiene varias desventajas:

  • necesita un proceso "en vivo" para hacer esto (en otras palabras, su bonita impresora no funcionará cuando esté depurando un volcado del núcleo)
  • si el inferior está corrupto de alguna manera, las funciones de llamada en él probablemente lo corromperán aún más
  • si el inferior es múltiple enhebrado, y el lindo prin ter llama a una función que puede requerir un bloqueo (p. malloc), entonces es muy probable que provoque un bloqueo en la bonita impresora y no haya forma de recuperarse de dicho punto muerto.
+2

Cualquiera puede juntar un ejemplo, por favor utilice? – takbal

1

Esto no es de script Python, pero simple command sequences para la extensión del BGF. Estoy definiendo un nuevo comando llamado print_matrix.

(gdb) define print_matrix 
Type commands for definition of "print_matrix". 
End with a line saying just "end". 
>set $s_arr = $arg0 
>set $i=0 
>while($i < $arg1) 
>p (int [][$arg2]) *($s_arr + $i) 
>set $i = $i + 1 
>end 
>end 
(gdb) print_matrix arr 10 10 
$90 = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}} 
$91 = {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}} 
$92 = {{2, 3, 4, 5, 6, 7, 8, 9, 10, 11}} 
$93 = {{3, 4, 5, 6, 7, 8, 9, 10, 11, 12}} 
$94 = {{4, 5, 6, 7, 8, 9, 10, 11, 12, 13}} 
$95 = {{5, 6, 7, 8, 9, 10, 11, 12, 13, 14}} 
$96 = {{6, 7, 8, 9, 10, 11, 12, 13, 14, 15}} 
$97 = {{7, 8, 9, 10, 11, 12, 13, 14, 15, 16}} 
$98 = {{8, 9, 10, 11, 12, 13, 14, 15, 16, 17}} 
$99 = {{9, 10, 11, 12, 13, 14, 15, 16, 17, 18}} 
(gdb) 

También puede guardar estos comandos como una secuencia de comandos y la opción -x

gdb -x <commands file name> binary.out 
+0

Gracias, pero necesito usar las bonitas instalaciones de impresión debido a su integración con Eclipse. – takbal

Cuestiones relacionadas