![Instagram-Rollen vs. TikTok; Welche App eignet sich besser zum Erstellen kurzer Videos?](/f/5681102d588f18604d706674e953d47d.jpg?width=100&height=100)
Ein Debugger spielt in jedem Softwareentwicklungssystem eine entscheidende Rolle. Niemand kann auf einmal einen fehlerfreien Code schreiben. Im Laufe der Entwicklung werden Fehler gemeldet, die zur weiteren Verbesserung behoben werden müssen. Ein Entwicklungssystem ist ohne Debugger unvollständig. In Anbetracht der Open-Source-Entwicklergemeinschaft ist GNU Debugger ihre beste Wahl. Es wird auch für die kommerzielle Softwareentwicklung auf UNIX-Plattformen verwendet.
GNU-Debugger, auch bekannt als gdb, ermöglicht es uns, durch den Code zu schleichen, während er ausgeführt wird oder was ein Programm im Moment vor dem Absturz versucht hat. GDB hilft uns im Grunde, vier Dinge zu tun, um Fehler im Quellcode zu erkennen.
Wir können gdb verwenden, um in geschriebene Programme zu debuggen C und C++ ohne großen Aufwand. Ab sofort Unterstützung für andere Programmiersprachen wie D, Modula-2, Fortran sind teilweise.
GDB wird aufgerufen mit dem gdb Befehl. Bei der Ausgabe gdb, es zeigt einige Informationen über die Plattform an und führt Sie in die (gdb) Eingabeaufforderung wie unten gezeigt.
[[E-Mail geschützt] ~]# gdb
GNU gdb (GDB) Fedora 7.6.50.20130731-19.fc20 Copyright (C) 2013 Free Software Foundation, Inc. Lizenz GPLv3+: GNU GPL Version 3 oder höher Dies ist freie Software: Es steht Ihnen frei, sie zu ändern und weiterzugeben. Es gibt KEINE GEWÄHRLEISTUNG, soweit gesetzlich zulässig. Geben Sie "Kopieren anzeigen" und "Garantie anzeigen" ein, um Details anzuzeigen. Diese GDB wurde als "x86_64-redhat-linux-gnu" konfiguriert. Geben Sie "Konfiguration anzeigen" für Konfigurationsdetails ein. Anweisungen zur Fehlerberichterstattung finden Sie unter:. Das GDB-Handbuch und andere Dokumentationsressourcen finden Sie online unter:. Um Hilfe zu erhalten, geben Sie "Hilfe" ein. Geben Sie "apropos word" ein, um nach Befehlen zu suchen, die sich auf "word" beziehen. (gdb)
Typ Hilfe list auf, um die verschiedenen Befehlsklassen anzuzeigen, die in gdb verfügbar sind. Typ Hilfegefolgt von einem Klassennamen für eine Liste von Befehlen in dieser Klasse. Typ Hilf allen für die Liste aller Befehle. Abkürzungen für Befehlsnamen sind zulässig, wenn sie eindeutig sind. Sie können beispielsweise eingeben n statt tippen nächste oder C Pro fortsetzen usw.
Häufig verwendet gdb-Befehle sind in der folgenden Tabelle aufgeführt. Diese Befehle sind über die gdb-Eingabeaufforderung (gdb).
Befehl |
Beschreibung |
Lauf |
Starten Sie eine Programmausführung |
Verlassen |
gdb beenden |
Ausdruck drucken |
Ausdruck ausdrucken, wo ausdruck kann auch ein Variablenname sein |
nächste |
Gehe zur nächsten Zeile |
Schritt |
Schritt in die nächste Zeile |
fortsetzen |
Fortfahren von der aktuellen Zeile bis zum Programmende oder zum nächsten Unterbrechungspunkt |
Beachten Sie den Unterschied zwischen den beiden Befehlen Schritt und nächste. Das nächste Der Befehl geht nicht in die Funktion, wenn die nächste Zeile ein Funktionsaufruf ist. Wohingegen Schritt Befehl kann in die innere Funktion gehen und sehen, was dort passiert.
Betrachten Sie den folgenden Quellcode.
// Summe.c. #enthaltenint Summe (int a, int b) { int c; c = a + b; Rückkehr c; } int main() {int x, y, z; printf("\nGeben Sie die erste Zahl ein: "); scanf("%d", &x); printf("Geben Sie die zweite Zahl ein: "); scanf("%d", &y); z = Summe (x, y); printf("Die Summe ist %d\n\n", z); 0 zurückgeben; }
Um die Ausgabedatei zu debuggen, müssen wir dasselbe mit kompilieren -g Option zu gcc wie folgt.
$ gcc -g sum.c -o sum
Die Ausgabedatei Summe kann auf eine der folgenden 2 Arten an gdb angehängt werden:
1. Durch Angabe der Ausgabedatei als Argument für gdb.
$ gdb-Summe
2. Ausführen der Ausgabedatei in gdb mit Datei Befehl.
$gdb. (gdb) Dateisumme
Das aufführen Befehl listet Zeilen in der Quellcodedatei auf und bewegt den Zeiger. So zuerst aufführenzeigt die ersten 10 Zeilen und die nächsten an aufführen zeigt die nächsten 10 usw. an.
(gdb)-Liste. 1 #einschließen2 3 int Summe (int a, int b) { 4 int c; 5c = a + b; 6 zurück c; 7} 8 9 int main() {10 int x, y, z;
Um die Ausführung zu starten, geben Sie die LaufBefehl. Jetzt wird das Programm normal ausgeführt. Aber wir haben vergessen, einige Breakpoints zum Debuggen in den Quellcode zu setzen, oder? Diese Breakpoints können für Funktionen oder an bestimmten Zeilen angegeben werden.
(gdb) b main
Notiz: Ich habe eine Abkürzung verwendet B Pro brechen.
Nach dem Setzen des Unterbrechungspunkts an der Hauptfunktion wird die erneute Ausführung des Programms an der Zeile 11 angehalten. Dasselbe kann bewirkt werden, wenn die Zeilennummer vorher bekannt ist.
(gdb) b summe.c: 11
Gehen Sie nun durch die Codezeilen mit dem nächsteoder n Befehl. Es ist wichtig sich das zu merken nächste Der Befehl geht nicht in den Funktionscode, es sei denn, ein Haltepunkt für die Funktion wird festgelegt. Probieren wir es aus drucken Befehl jetzt. Setzen Sie den Unterbrechungspunkt auf die Funktionssumme wie unten beschrieben.
(gdb) b sum Breakpoint 1 bei 0x4005aa: Datei sum.c, Zeile 5. (gdb) r Startprogramm: /root/sum Geben Sie die erste Zahl ein: 2 Geben Sie die zweite Zahl ein: 3 Breakpoint 1, Summe (a=2, b=3) bei sum.c: 5 5 c = a + b; (gdb) p a $1 = 2 (gdb) p b $2 = 3. (gdb) c Fortsetzung. Die Summe ist 5 [Unterlegen 1 (Prozess 3444) normal beendet]
Wenn das ausgeführte Programm Befehlszeilenparameter erfordert, geben Sie diese zusammen mit dem Lauf Befehl als.
(gdb) laufen.. .
Gemeinsam genutzte Bibliotheksdateien, die dem aktuell ausgeführten Programm zugeordnet sind, können aufgelistet werden als.
(gdb) info share Von bis Syms Shared Object Library lesen 0x00000035a6000b10 0x00000035a6019c70 Ja /lib64/ld-linux-x86-64.so.2 0x00000035a641f560 0x00000035a6560bb4 Ja /lib64/libc.so.6
GDB ist auch in der Lage, Variablen während der Ausführung des Programms zu ändern. Probieren wir das aus. Wie oben erwähnt, setzen Sie den Breakpoint in Zeile 16 und führen Sie das Programm aus.
(gdb) r Startprogramm: /root/sum Geben Sie die erste Zahl ein: 1 Geben Sie die zweite Zahl ein: 2 Breakpoint 1, main ( ) at sum.c: 16 16 printf("Die Summe ist %d\n\n", z); (gdb) setze z=4 (gdb) c Fortsetzung. Die Summe beträgt 4
Jetzt a = 1, b = 2 und das Ergebnis sollte sein z = 3. Aber hier haben wir das Endergebnis geändert in z = 4 in der Hauptfunktion. Auf diese Weise kann das Debugging mit gdb vereinfacht werden.
Um die Liste aller Haltepunkte zu erhalten, geben Sie ein Info-Haltepunkte.
(gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint y 0x00000000004005c2 in main at sum.c: 11
Hier gibt es nur einen Haltepunkt und es ist To. aktiviert Haltepunkte deaktivieren Angabe der Haltepunktnummer zusammen mit dem deaktivieren Befehl. Um es später zu aktivieren, verwenden Sie die ermöglichen Befehl.
(gdb) deaktivieren 1 (gdb) Info-Breakpoints Num Type Disp Enb Address What 1 Breakpoint Keep n 0x00000000004005c2 in main at sum.c: 11
Sie können die Haltepunkte auch mit löschen löschen Befehl.
In einem GNU/Linux-System laufen im Hintergrund zahlreiche Prozesse. Um einen laufenden Prozess zu debuggen, müssen wir zunächst die Prozess-ID dieses bestimmten Prozesses finden. pidofBefehl gibt Ihnen die PID eines Prozesses.
$ pidof
Jetzt müssen wir diese PID an gdb anhängen. Es gibt 2 Möglichkeiten.
1. Durch Angabe von pid zusammen mit gdb.
$gdb -p
2. Verwenden von anfügen Befehl von gdb.
(gdb) anhängen
Das ist alles für jetzt. Dies sind nur die Grundlagen von gdb, um einen guten Einstieg in das Debuggen von Quellcode zu erhalten, und es ist viel mehr als die oben beschriebenen Dinge. Zum Beispiel können wir mit den Stack-Informationen, Umgebungsvariablen und vielem mehr debuggen. Versuchen Sie, mit all diesen Dingen herumzuspielen…