2009-07-07 4 views
27

Leute verwenden gdb an und aus für das Debugging, natürlich gibt es viele andere Debugging-Tools über die verschiedenen Betriebssysteme, with and without GUI and, maybe other fancy IDE features.Welche nützlichen GDB-Skripte haben Sie verwendet/geschrieben?

Ich möchte gerne what useful gdb scripts you have written and liked.
Während, ich meine nicht eine Dump von Befehlen in einer something.gdb Datei, die Sie Quelle, um eine Reihe von Daten zu ziehen, wenn das Ihren Tag gemacht, weitermachen und darüber reden.

  • denken Lets bedingte Verarbeitung, Regelkreise und Funktionen für mehr elegante und raffinierte Programmierung zu debuggen geschrieben und, vielleicht sogar für White-Box-Test
  • es interessant, wenn Sie debugging remote systems (sagen wir beginnen, über einen seriellen/Ethernet-Schnittstelle)
  • und was ist, wenn das Ziel ein Multi-Prozessor (und Multi-Thread-System)
mich

Lassen Sie einen einfachen Fall als ein Beispiel setzen ...
Sprich

Ein Skript, das seriell über Einträge
durchlaufen einen schlechten Eintrag in einem großen Hash-Tabelle
zu lokalisieren, die umgesetzt wird auf eine eingebettete Plattform.

Das half mir einmal eine kaputte Hash-Tabelle zu debuggen.

Antwort

3

1. Beim Versuch, einige Closed-Source-DLLs von Drittanbietern mit unserem Projekt unter Mono zu arbeiten, gab es bedeutungslose Fehler. Folglich griff ich auf die Skripte aus der Mono project zurück.

2. Ich hatte auch ein Projekt, das seine eigenen Informationen zu stdout zur Verwendung in GDB, so an einem Breakpoint-Dump konnte ich die Funktion laufen konnte, dann cut-n-Paste seinen Ausgangs in GDB.

[Bearbeiten]

3. Die meisten meiner GCC/G ++ Gebrauch ist schon eine Weile her, aber ich erinnere mich auch mit einem Makro sich die Tatsache zunutze zu tragen, dass GDB die Mitglieder einer undurchsichtigen wusste Daten, die ich hatte (die Bibliothek wurde mit Debug kompiliert). Das war enorm hilfreich.

4. Und ich habe das auch gefunden. Es wird eine Liste von Objekten (von einer globalen "headMeterFix" SLL) ausgegeben, die unter anderem dynamische Arrays eines anderen Objekttyps enthalten. Eines der wenigen Male habe ich verschachtelte Schleifen in einem Makro verwendet:

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

Die Mono GDB ist schön - wußte nicht darüber. Nicht sicher, ob ich Ihren zweiten Teil richtig verstanden habe, beschreiben Sie eine Funktion, die in den Projektbaustein integriert wurde, um von einem Haltepunkt in GDB aufgerufen zu werden? das ist ein guter Trick und war nützlich über eine langsame serielle Linie Debug-Schnittstelle in einem meiner Projekte. – nik

+0

W.r.t der 2. Teil, es war lange her. Aber ja, es war der Quellcode, der nur an einem Haltepunkt in GDB aufgerufen werden sollte. Ich _think_ es war ein Versuch, einige Stapelkorruption mit Hilfe der * __ builtin_frame_address (n) * aufzuspüren - der ein Makro ist und nicht von GDB angerufen werden kann. – NVRAM

5

Beim Debuggen eines AOLserver SIGSEGV Absturzes, habe ich das folgende Skript den TCL-Level Call-Stack von GDB zu untersuchen:

Referenz
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