2009-07-07 13 views
27

Le persone usano gdb on e off per il debug, ovviamente ci sono molti altri strumenti di debug attraverso i vari SO, with and without GUI and, maybe other fancy IDE features.Quali utili script GDB hai usato/scritto?

Mi piacerebbe sapere what useful gdb scripts you have written and liked.
Mentre, non intendo un dump di comandi in un file something.gdb che viene fornito per estrarre un gruppo di dati, se questo ha reso la vostra giornata, andare avanti e parlarne.

  • lascia pensare elaborazione condizionale, controllo loop e funzioni scritte per la programmazione più elegante e raffinato per il debug e, forse anche per il test strutturale
  • cose si fanno interessanti quando si inizia debugging remote systems (ad esempio, su un seriale/interfaccia ethernet)
  • e, se il bersaglio è un multi-processore (e, multithread) sistema

Mettiamola un caso semplice come un esempio ...
Say,

Uno script che attraversato in modo seriale su voci
per individuare una brutta entrata in una grande hash-table
che viene implementato su una piattaforma integrata

Questo mi ha aiutato a eseguire il debug di un hash table una volta.

risposta

3

1. Quando si cerca di ottenere DLL di terze parti di terze parti che funzionano con il nostro progetto in Mono, si sono verificati errori privi di significato. Di conseguenza, ho fatto ricorso agli script dal numero Mono project.

2. ho avuto anche un progetto che potrebbe eseguire il dump di essa la propria informazioni per stdout per l'uso in GDB, quindi a un punto di interruzione, ho potuto eseguire la funzione, quindi tagliare-n-paste sua uscita in GDB.

[Edit]

3. maggior parte della mia GCC/G uso ++ è stato un po ', ma ho anche ricordare utilizzando una macro di approfittare del fatto che GDB conosceva i membri di qualche opaca dati che ho avuto (la libreria è stata compilata con il debug). E 'stato di enorme aiuto.

4. E ho appena trovato anche questo. Scarica una lista di oggetti (da uno SLL globale "headMeterFix") che contiene, tra le altre cose, array dinamici di un altro tipo di oggetto. Una delle poche volte che ho usato cicli annidati in 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 
+0

Il riferimento gdb Mono è bello - non lo so. Non sono sicuro se ho ottenuto correttamente la tua seconda parte, stai descrivendo una funzione che è stata integrata nella build del progetto per essere chiamata da un punto di interruzione in GDB? questo è un buon trucco ed è stato utile su una lenta interfaccia di debug della linea seriale in uno dei miei progetti. – nik

+0

W.r.t la seconda parte, era molto tempo fa. Ma sì, era il codice sorgente pensato per essere chiamato solo durante un breakpoint in GDB. I _think_ è stato un tentativo di rintracciare alcuni casi di corruzione dello stack con l'aiuto di * __ builtin_frame_address (n) * - che è una macro e non può essere chiamata da GDB. – NVRAM

5

Quando il debug di un incidente AOLserver SIGSEGV, ho usato il seguente script per esaminare la chiamata stack di TCL-level da 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 
Problemi correlati