debugging scripting gdb

debugging - ¿Qué scripts GDB útiles has usado/escrito?



scripting (3)

Al depurar una falla de AOLserver SIGSEGV, usé el siguiente script para examinar la pila de llamadas de nivel TCL de GDB:

define tcl_stack_dump set $interp = *(Interp*)interp set $frame = $interp->framePtr while (0 != (CallFrame *)$frame->callerPtr != 0) set $i = 0 if 0 != $frame->objv while ($i < $frame->objc) if (0 != $frame->objv[$i] && 0 != $frame->objv[$i]->bytes) printf " %s", (char *)(CallFrame *)$frame->objv[$i]->bytes end set $i = $i + 1 end printf "/n" end set $frame = (CallFrame *)$frame->callerPtr end end document tcl_stack_dump Print a list of TCL procs and arguments currently being called in an interpreter. Most TCL C API functions beginning with Tcl[^_] will have a Tcl_Interp parameter. Assumes the `interp'' local C variable holds a Tcl_Interp which is represented internally as an Interp struct. See: ptype Interp ptype CallFrame ptype Proc ptype Command ptype Namespace ptype Tcl_Obj end

La gente usa gdb y otra vez para la depuración, por supuesto, hay muchas otras herramientas de depuración en los distintos sistemas operativos, con y sin GUI y, tal vez, otras funciones IDE de lujo .

Me gustaría saber qué scripts gdb útiles ha escrito y le han gustado .
Si bien, no me refiero a un volcado de comandos en un archivo something.gdb que obtengas para extraer una gran cantidad de datos, si eso hizo que tu día, adelante, habla sobre ello.

  • Permite pensar en el procesamiento condicional , los bucles de control y las funciones escritas para una programación más elegante y refinada para depurar y, tal vez, incluso para las pruebas de caja blanca
  • Las cosas se ponen interesantes cuando comienza a depurar sistemas remotos (por ejemplo, a través de una interfaz serial / ethernet)
  • Y, ¿qué pasa si el objetivo es un sistema multiprocesador (y multiproceso)?

Déjame poner un caso simple como ejemplo ...
Decir,

Un script que atravesó en serie sobre las entradas.
para localizar una entrada incorrecta en una tabla hash grande
que se implementa en una plataforma embebida.

Eso me ayudó a depurar una tabla hash rota una vez.



1. Cuando intentaba que algunas DLL de código cerrado de terceros trabajaran con nuestro proyecto bajo Mono, estaba dando errores sin sentido. En consecuencia, recurrí a los guiones del proyecto Mono .

2. También tuve un proyecto que podría volcar su propia información a la salida estándar para su uso en GDB, por lo que en un punto de interrupción, podría ejecutar la función, luego cortar y pegar su salida en GDB.

[Editar]

3. La mayor parte de mi uso de GCC / G ++ ha sido un tiempo, pero también recuerdo haber usado una macro para aprovechar el hecho de que GDB conocía a los miembros de algunos datos opacos que tenía (la biblioteca se compiló con depuración). Eso fue de gran ayuda.

4. Y acabo de encontrar esto, también. Vuelca una lista de objetos (de un SLL "headMeterFix" global) que contiene, entre otras cosas, arreglos dinámicos de otro tipo de objeto. Una de las pocas veces que he usado bucles anidados en una macro:

define showFixes set $i= headMeterFix set $n = 0 while ($i != 0) set $p = $i->resolved_list set $x = $i->resolved_cnt set $j = 0 printf "%08x [%d] = {", $i, $x printf "%3d [%3d] %08x->%08x (D/R): %3d/%-3d - %3d/%-3d {", $n, $i, $x, $i->fix, $i->depend_cnt, dynArySizeDepList($i->depend_list), $i->resolved_cnt, dynArySizeDepList($i->resolved_list) while ($j < $x) printf " %08x", $p[$j] set $j=$j+1 end printf " }/n" set $i = $i->next set $n = $n+1 end end