Gdb oder GNU Project Debugger ist ein großartiges Werkzeug, wenn Sie ein Programm debuggen müssen. Sie können Haltepunkte setzen, auf Wertänderungen einer Variablen achten oder sogar einen Wert für das Programm ändern, während es an einem Punkt seines Zustands angehalten wird, und dann fortfahren, um nur einige der Funktionen von gdb auszuwählen.
In diesem Tutorial werden wir gdb auf RHEL 8 installieren und testen, wie es mit einer einfachen C-Anwendung funktioniert.
In diesem Tutorial lernen Sie:
- Wie installiere ich gdb
- Wie man eine einfache C-Anwendung mit Debug-Symbolen kompiliert
- Wie man Haltepunkte in der laufenden Anwendung mit gdb setzt
- So drucken Sie tatsächliche Werte bestimmter Variablen innerhalb der Anwendung
Durchlaufen einer for-Schleife mit gdb.
Softwareanforderungen und verwendete Konventionen
Kategorie | Anforderungen, Konventionen oder verwendete Softwareversion |
---|---|
System | Red Hat Enterprise Linux 8 |
Software | gdb 8.2 |
Andere | Privilegierter Zugriff auf Ihr Linux-System als root oder über sudo Befehl. |
Konventionen | # – erfordert, dass bestimmte Linux-Befehle mit Root-Rechten ausgeführt werden, entweder direkt als Root-Benutzer oder durch Verwendung von sudo Befehl$ – erfordert, dass bestimmte Linux-Befehle als normaler, nicht privilegierter Benutzer ausgeführt werden |
Schritt-für-Schritt-Anleitung zur Installation von gdb in Redhat Linux 8
Für dieses Tutorial verwenden wir eine einfache C-Anwendung, die einige Variablen setzt, Text ausgibt und später die Werte ihrer Variablen ändert. Es wurde nur erstellt, um einige Funktionen von gdb
zu zeigen , und wird nicht in der realen Welt verwendet.
Wenn Sie mit der Programmiersprache C nicht vertraut sind, können Sie sich die Einführung in die C-Entwicklung unter Linux ansehen, um loszulegen. Betrachten Sie zunächst den folgenden Quellcode, den wir in die vars.c
einfügen werden Textdatei:
#include <stdio.h>
int main()
{
int i = 1;
int j = 10;
printf("Variables set\n)";
i++;
j = 20;
printf("Variable values modified\n");
return 0;
}
Wir verwenden dieses einfache Programm, um gdb
zu testen . Sie können anhand des Codes feststellen, dass die Wertvariablen i
und j
take werden im normalen Programmlauf niemals offengelegt, daher wissen wir nicht, welche Werte wo und wann sie haben. In diesem Fall ist es eine einfache Speicherverschwendung, aber denken Sie an einen Anwendungsfall, bei dem i
würde etwas Wichtiges enthalten, vielleicht ein hartcodiertes Passwort, einen Cheat-Code oder einen anderen Schatz (oder kann einfach nicht finden, wo die Berechnungen Ihres Programms schief gehen).
gdb
ist Teil derDevelopment Tools
Paketgruppe, wenn Sie also Entwicklungstools installiert haben, haben Sie bereits gdb. Wenn nicht, können Sie es selbst installieren:# dnf install gdb
Für unsere Tests benötigen wir auch debuginfo für glibc:
# dnf debuginfo-install glibc-2.28-18.el8.x86_64
- Wir haben das Debugger-Tool und den Quellcode. Damit das Debuggen nützlich ist, müssen wir unser Programm mit Debug-Symbolen kompilieren (wir fügen das
-g
hinzu Option):$ gcc -g -o vars vars.c
Wenn wir unsere
vars
ausführen Programm, es gibt die Strings inprintf
aus Zeilen, aberi
wird nicht erwähnt undj
, wie erwartet.$ ./vars Variables set Variable values modified
- Wir müssen die Werte von
i
kennen undj
wenn sie zum ersten Mal gesetzt wurden und bevor das Programm beendet wurde. Betrachten Sie die Zeilen #7 und #10 (dieprintf
Zeilen) in der Quelle. Es wäre ideal, wenn wir die Ausführung an diesen Zeilen stoppen, die Werte abrufen und das Programm dann wieder loslassen könnten usw. Wir werden genau dies tun, umgdb
zu testen . Wir beginnen es mit den kompiliertenvars
ausführbar als Argument:$ gdb vars GNU gdb (GDB) Red Hat Enterprise Linux 8.2-3.el8 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from vars...done. (gdb)
gdb
liest die Symbole im Programm und gibt uns die Aufforderung zum Handeln. Dievars
Programm wird zu diesem Zeitpunkt noch nicht gestartet. Wir überprüfen unsere Notizen und setzen einenbreakpoint
in Zeile #7:(gdb) break 7 Breakpoint 1 at 0x40059c: file vars.c, line 7.
Und Zeile #10:
(gdb) break 10 Breakpoint 2 at 0x4005b1: file vars.c, line 10.
Mit gesetzten Breakpoints starten wir die Ausführung:
(gdb) run Starting program: /tmp/devel/vars Breakpoint 1, main () at vars.c:7 7 printf("Variables set\n");
Die Ausführung stoppt am ersten Haltepunkt und wir können die Werte der versteckten Variablen ausgeben:
(gdb) print i $1 = 1 (gdb) print j $2 = 10
Wir haben den ersten Teil der benötigten Informationen erhalten, fahren wir mit der Ausführung fort:
(gdb) continue Continuing. Variables set Breakpoint 2, main () at vars.c:10 10 printf("Variable values modified\n");
Beim nächsten Haltepunkt können wir die Werte auf die gleiche Weise ausgeben:
(gdb) print i $3 = 2 (gdb) print j $4 = 20
Wir haben alles, was wir brauchten. Es sind keine Haltepunkte mehr übrig, daher wird die Anwendung nach dem Drucken der letzten Textzeile normal beendet.
(gdb) continue Continuing. Variable values modified [Inferior 1 (process 2330) exited normally] (gdb) q
Wir haben die Werte der geheimen Variablen erhalten und unsere
gdb
getestet ist so nützlich, wie es sein soll.