Gdb

Aus VDR Wiki
Version vom 7. Mai 2006, 20:49 Uhr von Hulk (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Der GNU Debugger, normalerweise GDB abgekürzt, ist der Standard-Debugger des GNU-Projekts. Als debuggen wird das Auffinden, Diagnostizieren und Eliminieren von Fehlern bezeichnet.

Ein Werkzeug zur Fehlerbereinigung von Software nennt sich Debugger. Der Debugger ermöglicht in der Regel eine Ablaufverfolgung des zu untersuchenden Programmes in einzelnen Schritten oder zwischen definierten Haltepunkten.

Inhaltsverzeichnis

Einführung

Dieses ist eine sehr kurze Einleitung in das Anwendung von gdb. Gerichtet ist an alle Anwender, der ein ernstes Problem mit dem VDR, einen Plugin oder einer anderen Anwendung hat. Und mit der Mithelfen möchte indem er Debugger-Ausgaben dem Entwickler oder dem Betreuer dieses Programmes, als ausführliche Informationen des Problemes übergibt.

Debugger Ausgaben

Programme können zusätzlich eingebaute Debugger Informationen enthalten. gdb kann die Debugger Informationen verwenden, um ausführlichere Informationen zur Verfügung zu stellen (wie Funktion Prototypen, Quellcode-Dateinamen und Zeilenzahlen,...), so ist es im Allgemeinen eine gute Idee, ein Programm so zu verwenden, des es eingebaute Debugger Informationen enthält.

Der Kompiler gcc hat eine Kommandozeilenschalter (-g), welcher den gcc anweist Debugger Informationen in die Objekt- und Ausführbaren Programmdateien zuschreiben.

Analysieren einer Segfault

Der Linux Kernel ist in der Lage, einen sogenannten Kernelspeicherabzug zu schreiben, wenn irgendeine Anwendung abstürzt. Dieser Kernelspeicherabzug notiert den Zustand des Prozesses zu der Zeit des Abbruchs. gdb kann solch einen Kernspeicherabzug lesen und Informationen aus ihm heraus erhalten.

Die meisten Distributionen haben diese Kernelspeicherabzug, die durch eine Einstellung gesperrt, so mußt sie zuerst reaktiviert werden. "ulimit -c unlimited" macht dies für die gegenwärtige Shell und alle Prozesse, die von ihm begonnen werden. Überprüfe die Bash-Man-Seite, wenn du mehr über den ulimit Befehl wissen möchtest.

Nächstes Mal wenn die Anwendung mit einem segfault abstürzt, siehst du, daß die Anzeige "Segmentation fault", in "Segmentation fault (core dumped)" geändert wurde. Und eine eine Datei "core" oder "core.pid" im aktuellen Verzeichnis gestellt wurde. Anmerkung: Du benötigst auch Schreibberechtigung für das aktuelle Verzeichnis, andernfalls wird keine Datei erstellt.

Jetzt ist es Zeit, gdb zu starten, um zu sehen, was genau geschah. Das erste Argument für gdb sollte die abgestürzte Anwendung, das zweite der Kernelspeicherabzug sein, der wegen des Abbruchs geschrieben wurde. gdb listet viele Informationen auf und begrüßt dich mit einer "(gdb)" Aufforderung, wenn es abgeschlossen ist. Die nützlichste Information für einen Entwickler ist ein sogenanntes Stacktrace. Schreibe "bt" in der Aufforderung um gdb aufzufordern, um einen Stacktrace zu auszugeben, welches du dann zum Entwickler verschicken kannst. Mit "quit" verlässt man gdb.

Andere Weisen, gdb zu benutzen

Du kannst eine Anwendung unter Steuerung des gdb vollständig startem. Das tun gerechte Art „gdb Anwendung“. In der gdb Eingabeaufforderung verwendet „run Parameter“, um die Anwendung zu starten. Wenn die Anwendung ein Signal empfängt, wird gdb die Eingabeauforderung zeigen um Befehle dazu einzugeben. Du kannst jederzeit Strg-C drücken, um eine gdb Eingabeauforderung zu erhalten.

Die nützlichsten gdb Befehle sind

bt - Ausgabe eines stacktrace (siehe obrige Ausführung).

c - Fortsetzen der gestarteten Anwendung.

print Ausdruck - den Wert des spezifizierten Ausdruckes ausgeben. Kann verwendet werden, den Wert bestimmter Variablen zum Beispiel zu kontrollieren, spezifizieren einfach den variablen Namen als Ausdruck

quit - beendet gdb.

Es ist auch möglich, gdb an einem bereits laufenden Prozeß anzudocken. Dieses kann mit „gdb Anwendung pid“ getan werden. gdb dockt am Prozeß an, der durch die Prozeßkennzeichnung spezifiziert wird, die könnte nützlich sein, wenn die Anwendung, in einer Endlos-Schleife verweilt und du feststellen möchtest, wo sie genau hängt.