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.
Este script, no escrito por mí, imprime bastante los contenedores STL, como vector, mapa, etc.: http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt
Completamente asombroso.
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