Linux gdb-Befehl
GDB (GNU Debugger) ist das am häufigsten verwendete Werkzeug zum Debuggen von Programmen auf Linux-Systemen. Es kann Entwicklern helfen:
- Den Ablauf der Programmausführung verfolgen
- Haltepunkte setzen, um die Programmausführung anzuhalten
- Variablenwerte anzeigen und ändern
- Ursachen von Programmabstürzen analysieren
- Den Funktionsaufruf-Stack untersuchen
GDB unterstützt mehrere Programmiersprachen, darunter C, C++, Objective-C, Fortran, Ada usw., und ist ein unverzichtbares Debugging-Tool für Linux-Entwickler.
gdb installieren
Auf den meisten Linux-Distributionen kann gdb einfach über den Paketmanager installiert werden:
Beispiele
sudo apt-get install gdb
# CentOS/RHEL
sudo yum install gdb
# Fedora
sudo dnf install gdb
# Arch Linux
sudo pacman -S gdb
Nach der Installation lässt sich mit dem folgenden Befehl überprüfen, ob die Installation erfolgreich war:
gdb --version
Ein debugfähiges Programm kompilieren
Um ein Programm mit gdb zu debuggen, muss man die-gOption während der Kompilierung zum Erzeugen von Debugging-Informationen:
gcc -g program.c -o program
-gDiese Option bettet Quellcodeinformationen in die ausführbare Datei ein, wodurch gdb Maschinenanweisungen auf den Quellcode abbilden kann.
Grundlegende gdb-Befehle
gdb starten und beenden
Beispiele
g ./program
# gdb starten und an einen laufenden Prozess anhängen
gdb -p PID
# gdb beenden
(gdb) quit
# Kurzform
(gdb) q
Programm ausführen
Beispiele
(gdb) run
# Kurzform
(gdb) r
# Mit Argumenten ausführen
(gdb) run arg1 arg2
Breakpoint-Verwaltung
Beispiele
(gdb) break 10
# Kurzform
(gdb) b 10
# Breakpoint am Funktionseintritt setzen
(gdb) break main
(gdb) break function_name
# Alle Breakpoints anzeigen
(gdb) info breakpoints
# Haltepunkte löschen
(gdb) delete 1 # Haltepunkt Nummer 1 löschen
(gdb) delete # Alle Haltepunkte löschen
Steuerung der Programmausführung
Beispiele
(gdb) continue
# Kurzform
(gdb) c
# Einzelschritt ausführen (in Funktionen hineinspringen)
(gdb) step
# Kurzform
(gdb) s
# Einzelschritt ausführen (Funktionen überspringen)
(gdb) next
# Kurzform
(gdb) n
# Aktuelle Funktion zu Ende ausführen und zurückkehren
(gdb) finish
Code anzeigen
Beispiele
(gdb) list
# Kurzform
(gdb) l
# Code in der Nähe der angegebenen Zeile anzeigen
(gdb) list 15
# Den Code der angegebenen Funktion anzeigen
(gdb) list main
Variablen und Speicher untersuchen
Beispiele
(gdb) print variable_name
# Kurzform
(gdb) p variable_name
# Variablenwert ändern
(gdb) print variable_name = new_value
# Variablentyp anzeigen
(gdb) ptype variable_name
# Speicherinhalt anzeigen
(gdb) x/10xw &variable # 10 Wörter in Hexadezimal anzeigen
Aufrufstapelanalyse
Beispiele
(gdb) backtrace
# Kurzform
(gdb) bt
# Zum angegebenen Stackframe wechseln
(gdb) frame 2
# Kurzform
(gdb) f 2
Fortgeschrittene Debugging-Techniken
Bedingte Haltepunkte
Beispiele
(gdb) break 10 if i == 5
监视点
Beispiele
(gdb) watch variable_name
# Anhalten, wenn die Variable gelesen wird
(gdb) rwatch variable_name
# Anhalten, wenn die Variable gelesen oder geändert wird
(gdb) awatch variable_name
Multithread-Debugging
Beispiele
(gdb) info threads
# Zum angegebenen Thread wechseln
(gdb) thread 2
# Nur dem aktuellen Thread die Ausführung erlauben
(gdb) set scheduler-locking on
Core-Dump-Dateien debuggen
Beispiele
gdb ./program core
# Call-Stack zum Zeitpunkt des Absturzes anzeigen
(gdb) bt
Grafische Oberfläche von gdb
gdb unterstützt außerdem einen grafischen Oberflächenmodus, der mit dem Befehl gestartet werden kann-tuioption:
gdb -tui ./program
Oder wechseln Sie während der Verwendung dorthin:
Beispiele
(gdb) layout asm # Assembly-Fenster anzeigen
(gdb) layout regs # Registerfenster anzeigen
(gdb) layout split # Quellcode und Assembly gleichzeitig anzeigen
Praktische gdb-Konfiguration
Sie können gängige Konfigurationen zur~/.gdbinitDatei:
Beispiele
set print pretty on
# Verlaufsgröße festlegen
set history save on
set history size 1000
# Benutzerdefinierte Befehle
define printarray
set $i = 0
while $i < $arg0
printf "array[%d] = %dn", $i, $arg1[$i]
set $i = $i + 1
end
end
Fehlerbehebung bei häufigen Problemen
Quellcode kann beim Debuggen nicht angezeigt werden
- Stellen Sie sicher, dass die
-gOption bei der Kompilierung verwendet wird - Prüfen Sie, ob sich der Quellcode am selben Ort befindet wie zur Kompilierungszeit
- Verwenden Sie die
directoryBefehl zum Hinzufügen des Quellcodepfads:
(gdb) directory /path/to/source
Debuggen von optimiertem Code
Die Optimierung kann die Ausführungsreihenfolge des Codes ändern, was das Debuggen erschwert. Es wird empfohlen, die Optimierung beim Debuggen zu deaktivieren:
gcc -O0 -g program.c -o program
Zusammenfassung
gdb ist ein leistungsstarkes Debugging-Tool unter Linux. Wenn Sie es beherrschen, können Sie die Debugging-Effizienz erheblich verbessern. In diesem Artikel wurden die grundlegende Verwendung und die gängigen Befehle von gdb vorgestellt. Lesern wird empfohlen, dieses Wissen durch praktische Debugging-Übungen zu festigen. Mit zunehmender Erfahrung werden Sie feststellen, dass gdb Ihnen helfen kann, verschiedene komplexe Debugging-Probleme zu lösen.
Weitere Erweiterungen
Linux-Befehlsreferenz