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?


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

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

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.

21

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


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.


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


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.


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.


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

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.


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)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.