Die schwierigsten / nützlichsten Befehle für den GDB-Debugger [geschlossen]

138

Können Sie Ihre schwierigsten und nützlichsten Befehle veröffentlichen, während Sie einen Debugger wie gdb oder dbx ausführen?

Vijay
quelle
Ich fand diese Dokumentation gut. scc.ustc.edu.cn/zlsc/sugon/intel/debugger/cl/…
Rick

Antworten:

134
  1. Backtrace voll : Komplette Backtrace mit lokalen Variablen
  2. rauf , runter , Frame : Bewegen Sie sich durch Frames
  3. watch : Unterbrechen Sie den Vorgang, wenn eine bestimmte Bedingung erfüllt ist
  4. set print hübsch auf : Druckt hübsch formatierten C-Quellcode aus
  5. Anmelden festlegen : Protokollieren Sie die Debugging-Sitzung, um sie anderen zur Unterstützung anzuzeigen
  6. Druck-Array aktivieren : Hübsches Array-Drucken
  7. Fertig : Weiter bis zum Ende der Funktion
  8. Aktivieren und Deaktivieren : Haltepunkte aktivieren / deaktivieren
  9. tbreak : Einmal brechen und dann den Haltepunkt entfernen
  10. Dabei gilt Folgendes : Zeilennummer, die gerade ausgeführt wird
  11. Info-Einheimische : Alle lokalen Variablen anzeigen
  12. info args : Alle Funktionsargumente anzeigen
  13. Liste : Quelle anzeigen
  14. rbreak : Unterbrechung der Funktion, die dem regulären Ausdruck entspricht
Ramkumar Ramachandra
quelle
7
info locals- Alle lokalen Variablen anzeigen; Liste - Quelle anzeigen; rbreak - Unterbrechung der Funktion, die dem regulären Ausdruck entspricht.
Paul Biggar
source / path / to / macro / file Und alle meine raffinierten Makros helfen mir beim Debuggen in Sekunden.
Sudhanshu
1
set print object onfür polymorphe Elemente und set print elements 0sind zwei Befehle, die ich sehr oft benutze. Ziemlich nützlich.
Kiril Kirov
1
Auch t a a bt(Bedeutung thread apply all backtrace). Kann mit (fast) allen anderen Befehlen verwendet werden. Besonders nützlich bei bt full.
Kiril Kirov
101

Starten Sie gdb mit einer Textbenutzeroberfläche

gdb -tui
Amro
quelle
21
Ich kann nicht glauben, dass mir diese Funktion all die Jahre entgangen ist. Danke danke danke!
DevSolar
Danke Du hast viel Zeit gespart .. Wunderbar ....
Sujin
1
Und noch eine: <minus> RET
SullX
1
oder verwenden Sie cgdb
Patryk
sehr schöne Funktionen. Bisher verpasst ...
PraveenMax
45

Ab GDB 7.0 gibt es ein reversibles Debugging . Ihre neuen Lieblingsbefehle sind also:

* reverse-continue ('rc') -- Continue program being debugged but run it in reverse
* reverse-finish -- Execute backward until just before the selected stack frame is called
* reverse-next ('rn') -- Step program backward, proceeding through subroutine calls.
* reverse-nexti ('rni') -- Step backward one instruction, but proceed through called subroutines.
* reverse-step ('rs') -- Step program backward until it reaches the beginning of a previous source line
* reverse-stepi -- Step backward exactly one instruction
* set exec-direction (forward/reverse) -- Set direction of execution.
Paul Biggar
quelle
21

Anstatt GDB mit dem Parameter "-tui" zu starten, können Sie nach einiger Zeit auch in den Textmodus wechseln, indem Sie "wh" eingeben.

Martin
quelle
3
Strg-a a, um zur "normalen" Befehlszeilenansicht zurückzukehren!
Kevin
2
"- 'kann anstelle von' wh 'verwendet werden. kürzer je besser .. :)
raj_gt1
6
Ctrl-a a? Ist es ein Witz? Sieht eher nach tmux/ screencommand aus. Und funktioniert bei mir nicht. Es muss einer der folgenden sein wie pro docs : C-x C-a, C-x a, C-x A.
X-Yuri
Es ist tatsächlich C-x a. Sie können die Ansicht auch mit C-x 1und C-x 2im Tui-Modus wechseln, um auch die Baugruppe anzuzeigen (falls erforderlich).
Sam Whitlock
16

thread apply all btoder thread apply all print $pc: Um schnell herauszufinden, was alle Threads tun.

Olof
quelle
Das war der Befehl, nach dem ich lange gesucht habe! Es ist wirklich böse, alle 30 Threads einzeln zu überprüfen!
Tothphu
6

Zum Beispiel die in stl-views.gdb definierten Makros

grigy
quelle
6

Verwenden Sie die -command=<file with gdb commands>Option beim Starten von gdb. Gleich wie -x <command file>. Diese Befehlsdatei kann GDB-Befehle wie Haltepunkte, Optionen usw. enthalten. Nützlich, wenn eine bestimmte ausführbare Datei mit GDB aufeinanderfolgenden Debug-Läufen unterzogen werden muss.

Raghava
quelle
Sie können die -iexOption auch verwenden , um einzelne Befehle in der GDB-Befehlszeile hinzuzufügen.
Doug65536
5

Das Scripting von GDB ist ein guter Trick, ansonsten mag ich es, die Scheduler-Sperre ein- und auszuschalten, um zu verhindern, dass andere Threads ausgeführt werden, wenn Sie in einen Thread eintreten.

Ben
quelle
1
Wie stellen Sie die Scheduler-Sperre ein?
Deft_code
3
set scheduler-locking oninnerhalb gdb
Ben
Wie machst du das zum Standard? Ich habe es versucht .gdbinit, aber gdb druckt /home/omry/.gdbinit:1: Fehler in der Befehlsdatei: Das Ziel 'None' kann diesen Befehl nicht unterstützen.
Omry Yadan
4
  • Verwenden von .gdbinit (Startdatei, in der Sie Makros schreiben und von gdb aus aufrufen können). Platzieren Sie .gdbinit in Ihrem Home-Verzeichnis, damit es bei jedem Laden von gdb abgerufen wird
  • Info-Threads, um alle aktiven Threads aufzulisten, und f (#) -> # Thread-Nummer, zu der Sie wechseln möchten

  • Manchmal benutze ich GDB, um von Hex in Dezimal oder Binär zu konvertieren. Es ist sehr praktisch, anstatt einen Taschenrechner zu öffnen

    • p / d 0x10 -> ergibt ein Dezimaläquivalent von 0x10
    • p / t 0x10 -> binäres Äquivalent von 0x10
    • p / x 256 -> Hex-Äquivalent von 256
subbul
quelle
4

Anstatt gdb mit der Option -tui zu starten, um einen untergeordneten Prozess anzuzeigen, der einen Bildschirm enthält, der hervorhebt, wo sich die ausführende Codezeile in Ihrem Programm befindet, können Sie mit Cx o und Cx a in diese Funktion ein- und aussteigen. Dies ist nützlich, wenn Sie die Funktion verwenden und vorübergehend nicht verwenden möchten, damit Sie mit dem Aufwärtspfeil einen vorherigen Befehl abrufen können.

Rose Perrone
quelle
2
Sie können den Fokus auf das Befehlsfenster ändern, focus cmddamit die Aufwärts- / Abwärtspfeile funktionieren. Sie wechseln zurück mit focus src.
Nathan Fellman
3

Dies kann nützlich sein, ich bin mir jedoch sicher, dass es verbessert werden könnte.

define mallocinfo
  set $__f = fopen("/dev/tty", "w")
  call malloc_info(0, $__f)
  call fclose($__f)
Elmarco
quelle