Erste Schritte mit GDB unter Linux

Erste Schritte mit GDB unter Linux

Vorwort

gdb ist ein sehr nützliches Debugging-Tool unter Linux. Obwohl es ein Debugging-Tool im Befehlszeilenmodus ist, sind seine Funktionen leistungsfähiger, als Sie sich vorstellen können. Hier ist eine kurze Einführung in die Verwendung von gdb. Freunde in Not können sich die ausführliche Einführung unten ansehen.

Haltepunkte

An einer angegebenen Stelle im Code unterbrechen, wodurch das Programm dort unterbrochen wird.

  • break <function> Stoppen beim Aufrufen der angegebenen Funktion
  • break <Zeilennummer> Stoppt bei der angegebenen Zeilennummer.
  • break +/-offset Stoppt bei Offsetzeilen vor oder nach der aktuellen Zeilennummer. Offsett ist eine natürliche Zahl.
  • break filename:linenum. Stoppt bei Zeile „linenum“ in der Quelldatei filename.
  • break … if <Bedingung> … können die oben genannten Parameter sein, condition stellt die Bedingung dar und das Programm stoppt, wenn die Bedingung erfüllt ist. Beispielsweise können Sie im Hauptteil einer Schleife „break if i=100“ festlegen, was bedeutet, dass das Programm stoppt, wenn i 100 ist.

Beispiele:

(gdb) unterbricht sc_smartcontract_handler.cpp:45
Haltepunkt 4 bei 0x424d42: Datei sc_smartcontract_handler.cpp, Zeile 45.

Haltepunktbezogene Vorgänge

  • delete Alle Haltepunkte löschen
  • delete breakpoint [n] Einen Haltepunkt löschen
  • disable breakpoint [n] Einen Haltepunkt deaktivieren
  • enable breakpoint [n] Aktiviert einen Haltepunkt
  • info breakpoints [n] Aktuelle Breakpoint-Informationen anzeigen

Aussichtspunkt

Erfassungspunkte werden verwendet, um bestimmte Ereignisse während der Programmausführung zu erfassen. Wie zum Beispiel: Laden gemeinsam genutzter Bibliotheken (Dynamic Link Libraries), C++-Ausnahmen usw. Es wird häufig verwendet, um Fehler zu lokalisieren.

Das Befehlsformat zum Erfassen eines Punktes ist: catch <Ereignis>, wobei das Ereignis Folgendes sein kann:

  • watch <expr> Unterbrechung bei Variablenänderung
  • rwatch <expr> Unterbrechung beim Lesen der Variable
  • awatch <expr> Unterbrechung, wenn Variablenwert gelesen oder geschrieben wird

Mit dem Befehl info watchpoints [n] können Sie die aktuellen Watchpoint-Informationen anzeigen.

Anzeigen von Variablen

Die gebräuchlichste Art, Variablen anzuzeigen, ist

(gdb) drucke {Variablenname}

(gdb) drucke argc
1 USD = 1

Wenn Sie ein Array drucken, wird das Ende des gedruckten Arrays aufgrund der Standardeinstellungen möglicherweise nicht angezeigt. Sie können die maximale Länge des gedruckten Arrays mit dem folgenden Befehl festlegen:

(gdb) Druckelemente festlegen 300

Code während des Debuggens anzeigen

  • Listenfunktion, z. B. list main: Zeigt den Code in der Nähe der Hauptfunktion an.
  • list file:function Beispielsweise zeigt list main.c:main: den Code in der Nähe der Hauptfunktion in main.c an.
  • Liste n1,n2, z. B. Liste 10,20, zeigt die Zeilen 10 bis 20 der aktuellen Datei an

Obwohl die Liste sehr praktisch ist, ist sie dennoch nicht zufriedenstellend. Es wäre schön, wenn der Code während der Ausführung angezeigt werden könnte. Die Antwort ist ja.

Verwenden Sie den folgenden Befehl, um gdb zu starten: gdb -tui Projektname oder geben Sie nach dem Starten von gdb den Befehlsfokus ein, wie in der Abbildung gezeigt:

Fortsetzen der Programmausführung und des Debuggens in einzelnen Schritten

In gdb lauten die mit der schrittweisen Fehlerbehebung verbundenen Befehle hauptsächlich wie folgt:

  • continue Das Programm wird bis zum nächsten Haltepunkt weiter ausgeführt (ähnlich wie F5 in VS)
  • Weiter: Schritte durch den Prozess, ohne die Unterfunktion aufzurufen (ähnlich wie F10 in VS)
  • setp Schritt für Schritt-Anweisung, ruft die Unterfunktion auf (ähnlich wie F11 in VS)
  • Until wird ausgeführt, bis der aktuelle Anweisungsblock endet.
  • finish Führt die Funktion bis zum Ende aus, springt heraus und druckt den Rückgabewert der Funktion aus (ähnlich wie bei VS Shift+F11)

Unterbrechung in einem bestimmten Thread

Sie können definieren, ob Ihr Haltepunkt auf allen Threads oder auf einem bestimmten Thread liegen soll. GDB kann Ihnen dabei problemlos helfen.

  • unterbrechen <Zeilenspezifikation> Thread <Threadnr.>
  • unterbreche <Zeilenspezifikation> Thread <Threadnummer>, wenn …

„linespec“ gibt die Quellzeilennummer an, in der der Haltepunkt gesetzt ist. threadno gibt die Thread-ID an. Beachten Sie, dass diese ID von GDB zugewiesen wird. Sie können Thread-Informationen im laufenden Programm über den Befehl „info threads“ anzeigen. Wenn Sie den Thread <threadno> nicht angeben, bedeutet dies, dass Ihr Haltepunkt für alle Threads festgelegt ist. Sie können auch Haltepunktbedingungen für einen Thread angeben. wie:

(gdb) unterbreche frik.c:13 Thread 28, wenn Bartab > lim

Wenn Ihr Programm von GDB gestoppt wird, werden auch alle laufenden Threads gestoppt. Dadurch können Sie den Gesamtstatus des laufenden Programms sehen. Wenn Sie das Programm fortsetzen, werden alle Threads fortgesetzt. Auch wenn der Hauptprozess in einzelnen Schritten debuggt wird.

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • So verwenden Sie gdb zum Debuggen von Kerndateien in Linux
  • Ein einfaches Tutorial zur Verwendung des Linux-Debugging-Tools GDB
  • Debuggen von Linux-Anwendungen mit den Befehlen gdb und gdbserver
  • Zusammenfassung gängiger Befehle basierend auf den Linux-Debugging-Tools strace und gdb
  • Detaillierte Erklärung der grundlegenden Verwendung des Linux-Debuggers GDB

<<:  MySQL 5.7.18 Installations- und Konfigurations-Tutorial unter Windows

>>:  So verwenden Sie JSX zum Implementieren von Karussellkomponenten (Front-End-Komponentenbildung)

Artikel empfehlen

So ändern Sie schnell das Hostattribut eines MySQL-Benutzers

Wenn Sie sich remote bei MySQL anmelden, gelten f...

Lösen Sie das Problem des IDEA-Konfigurations-Tomcat-Startfehlers

Beim Konfigurieren unterschiedlicher Servlet-Pfad...

Versuchen Sie Docker+Nginx, um die Single-Page-Anwendungsmethode bereitzustellen

Von der Entwicklung bis zur Bereitstellung: Mache...

Detaillierte Erklärung der Linux-RPM- und Yum-Befehle und -Verwendung

RPM-Paketverwaltung Ein Verpackungs- und Installa...

Miniprogramm zur Implementierung der Rechnerfunktion

In diesem Artikelbeispiel wird der spezifische Co...

Zusammenfassung der SQL-Deduplizierungsmethoden

Wenn wir SQL zum Extrahieren von Daten verwenden,...

Eine Kurzanleitung zu MySQL-Indizes

Die Einrichtung eines MySQL-Index ist für den eff...

Probleme und Lösungen bei der Verwendung der jsx-Syntax in React-vscode

Problembeschreibung Nach der Installation des Plu...

Interpretation von 17 Werbewirksamkeitsmaßen

1. 85 % der Anzeigen werden nicht gelesen <br ...

Vue implementiert die Funktionen Vergrößern, Verkleinern und Ziehen

In diesem Artikelbeispiel wird der spezifische Co...

503 Dienst nicht verfügbar Fehlerlösungserklärung

1. Beim Öffnen der Webseite wird die Meldung „503...

Vue implementiert zwei Methoden zur Steuerung der Routing-Berechtigung

Inhaltsverzeichnis Methode 1: Routing von Metainf...