GNU -Debugger
![]() | |
![]() | |
Entwickler (en) | GNU -Projekt |
---|---|
Erstveröffentlichung | 1986 |
Stabile Version | 12.1[1] ![]() |
Repository | |
Geschrieben in | C |
Betriebssystem | Unix-artig, Fenster |
Typ | Debugger |
Lizenz | GPLV3 |
Webseite | www |
Das GNU -Debugger (GDB) ist ein tragbar Debugger das läuft auf vielen Unix-artig Systeme und funktioniert für viele Programmiersprachen, einschließlich Ada, C, C ++, Ziel c, Kostenloser Pascal, Forran, gehen,[2] und teilweise andere.[3]
Geschichte
GDB wurde zuerst von geschrieben von Richard Stallman 1986 als Teil seiner GNU System nach seinem GNU EMACS war "einigermaßen stabil".[4] GDB ist gratis Software unter dem GNU Allgemeine öffentliche Lizenz (GPL). Es wurde nach dem modelliert DBX Debugger, der mit kam mit Berkeley Unix Verteilungen.[4]
Von 1990 bis 1993 wurde es von unterhalten John Gilmore.[5] Jetzt wird es vom GDB -Lenkungsausschuss unterhalten, der von der ernannt wird Kostenlose Software -Stiftung.[6]
Technische Details
Merkmale
GDB bietet umfangreiche Einrichtungen zur Verfolgung und Veränderung der Ausführung von Computerprogramme. Der Benutzer kann die Werte der Programme der Programme überwachen und ändern Variablen, und sogar anrufen Funktionen unabhängig vom normalen Verhalten des Programms.
Zu den GDB -Zielprozessoren (ab 2003) gehören: Alpha, ARM, Avr, H8/300, Altera nios/nios ii, System/370, System 390, X86 und seine 64-Bit-Erweiterung X86-64, IA-64 "Itanium", Motorola 68000, MIPS, Pa-risc, Powerpc, Superh, Sparc, und Vax. In der Standardveröffentlichung unterstützte weniger bekannte Zielprozessoren wurden enthalten A29K, BOGEN, ETRAX CRIS, D10V, D30V, FR-30, FR-V, Intel i960, 68HC11, Motorola 88000, MCORE, Mn10200, MN10300, NS32K, Stormy16 und Z8000. (Neuere Veröffentlichungen werden wahrscheinlich einige davon nicht unterstützen.) GDB hat zusammengestellt Simulatoren für noch weniger bekannte Zielprozessoren wie wie M32R oder V850.[7]
GDB wird immer noch aktiv entwickelt. Ab Version 7.0 sind neue Funktionen für die Unterstützung für die Unterstützung für Python Scripting[8] und ab Version 7.8 Gnu Guile Skripten auch.[9] Seit Version 7.0 ist die Unterstützung für das "reversible Debugging" - so dass eine Debugging -Sitzung rückwärts tritt, ähnlich wie das Wiederaufenthalt eines abgestürzten Programms, um zu sehen, was passiert ist -.[10]
Ferndebugging
GDB bietet einen "Remote" -Modus, der häufig beim Debuggen eingebetteter Systeme verwendet wird. Der Remote -Betrieb ist, wenn GDB auf einer Maschine ausgeführt wird und das Programm auf einem anderen ausgeführt wird. GDB kann mit dem Remote "Stub" kommunizieren, das das GDB -Protokoll über ein serielles Gerät oder TCP/IP versteht.[11] Ein Stub -Programm kann erstellt werden, indem mit den entsprechenden Stub -Dateien mit GDB geliefert wird, die die Zielseite des Kommunikationsprotokolls implementieren.[12] Alternative, gdbserver Kann verwendet werden, um das Programm aus der Ferne zu debuggen, ohne es in irgendeiner Weise ändern zu müssen.
Der gleiche Modus wird auch von verwendet von KGDB zum Debuggen eines Rennens Linux Kernel Auf der Quellebene mit GDB. Mit KGDB können Kernel -Entwickler einen Kernel auf die gleiche Weise debuggen, wie sie Anwendungsprogramme debuggen. Es ermöglicht es, Haltepunkte in den Kernelcode zu platzieren, den Code durchzusetzen und Variablen zu beobachten. Bei Architekturen, bei denen Hardware -Debugging -Register verfügbar sind, können Wachpoints festgelegt werden, die Breakpoints auslösen, wenn angegebene Speicheradressen ausgeführt oder zugegriffen werden. KGDB benötigt eine zusätzliche Maschine, die an die Maschine angeschlossen ist, die mit a debuggiert werden soll Serienkabel oder Ethernet. An FreebsdEs ist auch möglich zu debuggen, indem Sie mit Firewire direkter Speicherzugriff (DMA).[13]
Grafische Benutzeroberfläche
Der Debugger enthält seine eigene nicht grafische Benutzeroberflächeund standardmäßig a Befehlszeilenschnittstelle, obwohl es a enthält Text Benutzeroberfläche. Dafür wurden mehrere Frontends gebaut, wie beispielsweise Ultragdb, xxgdb, Datenanzeigedebugger (DDD), Nemiver, KDBG, die Xcode Debugger, GDBTK/Insight, Seher und HP Gui (WDB GUI). Ides wie zum Beispiel Codelit, Code :: Blöcke, Dev-C ++, Geany, GNAT -Programmierstudio (GEOGRAPHISCHES POSITIONIERUNGS SYSTEM), KDevelop, Qt Creator, Lazarus, Monode entwickelt, Finsternis, NetBeans, und Visual Studio kann mit gdb interface. GNU EMACS hat einen "Gud -Modus" und Werkzeuge für Vim existieren (z. B. Clewn). Diese bieten ähnliche Einrichtungen wie Debugger in IDES.
Einige andere Debugging -Tools wurden so konzipiert, dass sie mit GDB arbeiten, wie z. Speicherleck Detektoren.
Interna
GDB verwendet einen Systemaufruf mit dem Namen Ptrace (Der Name ist eine Abkürzung von "Prozessverfolgung"), um die Ausführung eines anderen Prozesses zu beobachten und zu kontrollieren und das Gedächtnis und das Register des Prozesses zu untersuchen und zu ändern. Eine Liste der gängigen GDB -Befehle und entsprechenden Ptrace -Aufrufe finden Sie unten:
- (GDB) Start: pTrace_traceme - macht Eltern zu einem Tracer (von einer Tracee genannt)
- (GDB) Anhängen PID: Ptrace_attach - Befestigen Sie sich an einen Laufprozess
- (GDB) STOP: Kill (Child_PID, Sigstop) (oder ptrace_interrupt)
- (GDB) Weiter: ptrace_cont
- (GDB) Info -Register: Ptrace_Get (FP) Regs (ET) und Ptrace_Set (FP) Regs (ET)
- (GDB) X: PTRACE_PEEKTEXT UND PTRACE_POKETEXT
Ein Haltepunkt wird implementiert, indem eine Anweisung an einer bestimmten Speicheradresse durch eine weitere spezielle Anweisung ersetzt wird. Ausführende Brechpoint -Anweisung verursacht Sigtrap.
Beispiele für Befehle
GDB -Programm | Debugug "Programm" (aus der Shell) |
---|---|
run -v | Führen Sie das geladene Programm mit den Parametern aus |
Bt | Backtrace (falls das Programm abstürzt) |
Info -Register | Füllen Sie alle Register ab |
disas $ PC-32, $ PC+32 | Zerlegt |
Eine Beispielsitzung
Betrachten Sie den folgenden Quellcode, der in geschrieben wurde C:
#enthalten #enthalten #enthalten size_t foo_len( Const verkohlen *s ) { Rückkehr Strlen( s ); } int hauptsächlich( int argc, verkohlen *argv[] ) { Const verkohlen *a = NULL; printf( "Größe von a = %lu\n", foo_len(a) ); Ausfahrt( 0 ); }
Verwendung der GCC Compiler auf LinuxDer obige Code muss mit dem kompiliert werden -g
Flag, um geeignete Debug -Informationen zum generierten Binäranschluss aufzunehmen, was es ermöglicht, sie mit GDB zu inspizieren. Angenommen, die Datei mit dem obigen Code ist benannt Beispiel.C
, der Befehl für die Zusammenstellung könnte sein:
$ GCC -Beispiel.c -og -g -o Beispiel
Und die Binärdatei kann jetzt ausgeführt werden:
$ ./BeispielSegmentierungsfehler
Seit dem Beispielcode erzeugt bei der Ausführung a Segmentierungsfehler, GDB kann verwendet werden, um das Problem zu untersuchen.
$ gdb ./exampleGNU GDB (GDB) Fedora (7.3.50.20110722-13.FC16) Copyright (C) 2011 Free Software Foundation, Inc. Lizenz GPLV3+: GNU GPL Version 3 oder höher <https://gnu.org/licenses/gpl.html> Dies ist eine kostenlose Software: Sie können sie ändern und neu verteilen. Es gibt keine Garantie, sofern dies gesetzlich zulässig ist. Geben Sie "Kopieren anzeigen" ein und "Garantie" für Einzelheiten. Dieses GDB wurde als "x86_64-redhat-linux-gnu" konfiguriert. Für Anweisungen zur Fehlerberichterstattung finden Sie unter: ... Lesen von Symbolen von /path/example...done. (GDB) Lauf Startprogramm: /Pfad /Beispiel Programm empfangenes Signal Sigsegv, Segmentierungsfehler. 0x0000000000400527 in foo_len (s = 0x0) bei Beispiel.c: 7 7 Return Strlen (s); (GDB) Druck s $1 = 0x0
Das Problem ist in Zeile 7 vorhanden und tritt beim Aufrufen der Funktion auf Strlen
(Weil sein Argument, s
, ist NULL
). Abhängig von der Umsetzung von Strlen (in der Reihe oder nicht), die Ausgabe kann unterschiedlich sein, z. B.:
GNU GDB (GDB) 7.3.1 Copyright (C) 2011 Free Software Foundation, Inc. Lizenz GPLV3+: GNU GPL Version 3 oder höher <https://gnu.org/licenses/gpl.html> Dies ist eine kostenlose Software: Sie können sie ändern und neu verteilen. Es gibt keine Garantie, sofern dies gesetzlich zulässig ist. Geben Sie "Kopieren anzeigen" ein und "Garantie" für Einzelheiten. Dieses GDB wurde als "i686-pc-linux-gnu" konfiguriert. Für Anweisungen zur Fehlerberichterstattung finden Sie unter: ... Lesen von Symbolen von /tmp/gdb/example...done. (GDB) Lauf Startprogramm:/TMP/GDB/Beispiel Programm empfangenes Signal Sigsegv, Segmentierungsfehler. 0xb7ee94f3 in strlen () von /lib/i686/cmov/libc.so.6 (GDB) Bt #0 0xb7ee94f3 in Strlen () von /lib/i686/cmov/libc.so.6#1 0x08048435 in foo_len (s=0x0) bei Beispiel.c: 7#2 0x0804845a in hauptsächlich (argc=, argv=) bei Beispiel.c: 14
Um das Problem zu beheben, die Variable a
(in der Funktion hauptsächlich
) muss eine gültige Zeichenfolge enthalten. Hier ist eine feste Version des Code:
#enthalten #enthalten #enthalten size_t foo_len( Const verkohlen *s ) { Rückkehr Strlen(s); } int hauptsächlich( int argc, verkohlen *argv[] ) { Const verkohlen *a = "Dies ist eine Testzeichenfolge"; printf( "Größe von a = %lu\n", foo_len(a) ); Ausfahrt( 0 ); }
Neukompilieren und Ausführen der ausführbaren Datei in GDB nun liefert jetzt ein korrektes Ergebnis:
GNU GDB (GDB) Fedora (7.3.50.20110722-13.FC16) Copyright (C) 2011 Free Software Foundation, Inc. Lizenz GPLV3+: GNU GPL Version 3 oder später <https://gnu.org/licenses/gpl.html> Dies ist eine kostenlose Software: Sie können sie ändern und neu verteilen. Es gibt keine Garantie, sofern dies gesetzlich zulässig ist. Geben Sie "Copying" und "Garantie" für Details ein. Dieses GDB wurde als "x86_64-redhat-linux-gnu" konfiguriert. Für Anweisungen zur Fehlerberichterstattung siehe: <https://www.gnu.org/software/gdb/bugs/> ... Lesen von Symbolen von /path/example...done. (GDB) Ausführen von Startprogramm: /Path /Beispielgröße von a = 21 [Inferior 1 (Prozess 14290) Normalerweise verlassen]
GDB druckt die Ausgabe von printf
Auf dem Bildschirm und informiert dann den Benutzer, dass das Programm normal beendet wurde.
Siehe auch
Verweise
- ^ "GDB 12.1 veröffentlicht!"; Autorenname String: Joel Brobecker; Veröffentlichungsdatum: 1. Mai 2022; Abgerufen: 2. Mai 2022.
- ^ "GDB -Dokumentation - unterstützte Sprachen". Abgerufen 2011-11-28.
- ^ "GDB -Dokumentation - Zusammenfassung". Abgerufen 2011-11-28.
- ^ a b "Richard Stallman Lecture am Royal Institute of Technology, Schweden (1986-10-30)". Abgerufen 2006-09-21.
Dann, nachdem GNU EMACS einigermaßen stabil war, was in allen etwa anderthalb Jahren an andere Teile des Systems zurückkehrte. Ich habe einen Debugger entwickelt, den ich GDB nannte, einem symbolischen Debugger für C -Code, der kürzlich die Verbreitung eingegeben hat. Jetzt ist dieser Debugger in hohem Maße im Geiste von DBX, einem Debugger, der mit Berkeley Unix einhergeht.
- ^ "John Gilmore (Aktivist)". hyperleap.com.
- ^ "GDB -Lenkungsausschuss". Abgerufen 2008-05-11.
- ^ "GDB -Dokumentation - Zusammenfassung - Mitwirkende". Abgerufen 2011-12-01.
- ^ "GDB 7.0 Versionsnotizen". Abgerufen 2011-11-28.
- ^ Joel Brobecker (2014-07-29). "GDB 7.8 veröffentlicht!". Abgerufen 2014-07-30.
- ^ "Reverse Debugging mit GDB". Abgerufen 2014-01-20.
- ^ "Howto: GDB Remote Serial Protocol: Schreiben eines RSP -Servers" (PDF).
- ^ "Implementierung eines Remote -Stubs".
- ^ "Kernel -Debugging mit DCons".
Externe Links
- Offizielle Website
- UltragDB: Visual C/C ++ Debugging mit GDB unter Windows und Linux
- KGDB: Debugger der Linux -Kernel -Quellebene der Ebene
- Die Website für "MyGDB: GDB Frontend" in der koreanischen Sprache
- Ein Visual Studio -Plugin zum Debuggen mit GDB
- Vergleich der GDB-Frontends, 2013
- Verwenden von Eclipse als Front-End für den GDB-Debugger
Dokumentation
- Richard M. StallmanRoland Pesch, Stan Shebs et al.,, Debugging mit GDB (Kostenlose Software -Stiftung, 2011) ISBN978-0-9831592-3-0
- GDB -Interna
Tutorials
- GDB -Tutorial von RMS (Ryan Michael Schmidt, nicht Richard Matthew Stallman)
- GDB -Tutorial