Heim  >  Artikel  >  System-Tutorial  >  Das Evangelium des Debuggens von C-Programmen unter Linux – gdb

Das Evangelium des Debuggens von C-Programmen unter Linux – gdb

王林
王林nach vorne
2024-02-11 20:12:02911Durchsuche

Jeder Programmierer, egal wie erfahren er ist, kann Fehler in der Software nicht vollständig vermeiden. Daher ist die Fehlersuche und -behebung zu einer der wichtigsten Aufgaben im Softwareentwicklungszyklus geworden. Während es viele Möglichkeiten gibt, Fehler zu beheben, wie z. B. Tests und Selbstüberprüfung des Codes, kann auch spezielle Debugger-Software dabei helfen, das Problem zu lokalisieren und zu beheben.

Für Programmierer, die die Programmiersprache C/C++ oder Fortran und Modula-2 zum Entwickeln von Software verwenden, gibt es ein hervorragendes Debugger-Tool – GDB – eine gute Nachricht für sie. GDB hilft Programmierern nicht nur dabei, Fehler und andere Probleme in ihrem Code einfacher zu beheben, sondern bietet auch viele nützliche Funktionen und Optionen. In diesem Artikel besprechen wir einige Grundlagen des GDB-Debuggers sowie einige der nützlichen Funktionen und Optionen, die er bietet.

在 Linux 中调试 C 程序的福音——gdb

Bevor wir beginnen, ist es erwähnenswert, dass alle Anweisungen und Beispiele im Artikel auf Ubuntu 14.04 LTS getestet wurden. Die Beispielcodes im Tutorial sind alle in der Sprache C geschrieben; die verwendete Shell ist Bash (4.3.11); die GDB-Version ist 7.7.1.

GDB-Debugger-Grundlagen

Laienhaft ausgedrückt: Mit GDB können Sie den internen Ablauf des Programms während der Ausführung sehen und das Problem identifizieren. Wir werden die Verwendung des GDB-Debuggers anhand eines Arbeitsbeispiels im nächsten Abschnitt besprechen, aber vorher wollen wir einige grundlegende Punkte behandeln, die Ihnen später helfen werden.

Um einen Debugger wie GDB erfolgreich nutzen zu können, müssen Sie zunächst das Programm auf eine bestimmte Weise kompilieren, damit der Compiler die vom Debugger benötigten Debugging-Informationen generiert. Wenn Sie beispielsweise Code mit dem gcc-Compiler kompilieren (den wir später in diesem Tutorial zum Kompilieren der C-Programmbeispiele verwenden werden), müssen Sie die Befehlszeilenoption -g verwenden.

Informationen zur Befehlszeilenoption -g in der Manpage des gcc-Compilers finden Sie hier.

Stellen Sie als Nächstes sicher, dass der GDB-Debugger auf Ihrem System installiert ist. Wenn es nicht installiert ist und Sie ein Debian-basiertes System (z. B. Ubuntu) verwenden, können Sie das Tool einfach mit dem folgenden Befehl installieren:

sudo apt-get install gdb

Informationen zu Installationsmethoden für andere Distributionen finden Sie hier.

Wenn Sie nun das Programm wie oben beschrieben kompiliert haben (Befehlszeilenoption gcc -g) und den GDB-Debugger installiert haben, können Sie das Programm mit dem folgenden Befehl im Debug-Modus ausführen:

gdb [可执行程序的名称]

Dadurch wird der GDB-Debugger initialisiert, aber Ihre ausführbare Datei wird noch nicht gestartet. An dieser Stelle können Sie Debugging-bezogene Einstellungen definieren. Sie können beispielsweise einen Haltepunkt in einer bestimmten Zeile oder Funktion festlegen, damit GDB die Programmausführung in dieser Zeile anhält.

Als nächstes müssen Sie zum Starten Ihres Programms den folgenden gdb-Befehl eingeben und ausführen:

run

Hier ist es erwähnenswert, dass Sie diese Parameter hier angeben können, wenn Ihr Programm einige Befehlszeilenparameter erfordert. Zum Beispiel:

run [参数]

GDB bietet viele nützliche Befehle, die beim Debuggen immer nützlich sein können. Wir werden einige dieser Befehle im nächsten Abschnitt besprechen.

GDB-Debugger-Anwendungsfall

Jetzt haben wir eine grundlegende Vorstellung von GDB und seiner Verwendung. Wenden wir also das Gelernte anhand eines Beispiels an. Hier ist ein Beispielcode:

#include 
int main()
{
    int out = 0, tot = 0, cnt = 0;
    int val[] = {5, 54, 76, 91, 35, 27, 45, 15, 99, 0};

    while(cnt printf("/n Total = [%d]/n", tot);
    return 0;
}

Erklären Sie kurz, was dieser Code bewirkt. Rufen Sie jeden Wert im val-Array ab, weisen Sie ihn der Variablen out zu, fügen Sie dann den Wert vor tot und den Ergebniswert 0xffffffff/out hinzu und weisen Sie ihn der Variablen tot zu.

Das hier aufgetretene Problem besteht darin, dass beim Ausführen des mit diesem Code kompilierten ausführbaren Programms der folgende Fehler generiert wird:

$ ./gdb-testFloating point exception (core dumped)

Um diesen Code zu debuggen, besteht der erste Schritt darin, das Programm mit der Option -g zu kompilieren. Der Befehl lautet wie folgt:

gcc -g -Wall gdb-test.c -o gdb-test

Als nächstes führen wir den GDB-Debugger aus und geben das ausführbare Programm zum Debuggen an. Der Befehl lautet wie folgt:

gdb ./gdb-test

Der Fehler, den ich gerade erhalten habe, ist eine Gleitkomma-Ausnahme, die, wie die meisten von Ihnen wahrscheinlich bereits wissen, durch n % x verursacht wird, wenn x 0 ist. Aus diesem Grund habe ich in Zeile 11, wo die Divisionsoperation stattfindet, einen Haltepunkt hinzugefügt. Wie folgt:

(gdb)&;break 11

Hinweis (gdb) sind die Debugger-Eingabeaufforderungsinformationen. Ich habe nur den Befehl break 11 eingegeben.

Lassen Sie GDB nun mit der Ausführung des Programms beginnen:

run

Wenn der Haltepunkt zum ersten Mal erreicht wird, zeigt GDB die folgende Ausgabe an:

Breakpoint 1, main () at gdb-test.c:11
11 tot = tot + 0xffffffff/out;
(gdb)

Wie Sie sehen können, zeigt der Debugger die Codezeile an, in der sich der Haltepunkt befindet. Lassen Sie uns nun den aktuellen Wert ausdrucken. Wie folgt:

(gdb) print out
$1 = 5
(gdb)

如上所示,值 5被打印出来了。这个时候一切都还是正常的。让调试器继续执行程序直到命中下一个断点,可以通过使用 c 命令来完成:

c

重复上述操作,直到 out值变为0 时。

...
...
...
Breakpoint 1, main () at gdb-test.c:11
11 tot = tot + 0xffffffff/out;
(gdb) print out
$2 = 99
(gdb) c
Continuing.

Breakpoint 1, main () at gdb-test.c:11
11 tot = tot + 0xffffffff/out;
(gdb) print out
$3 = 0
(gdb)

现在,为了进一步确认问题,我使用 GDB 的s (或 step) 命令代替 c 命令。因为,我只想让当前程序在第 11 行之后暂停,再一步步执行,看看这个时候是否会发生崩溃。

以下是执行之后输出信息:

(gdb) s

Program received signal SIGFPE, Arithmetic exception.
0x080484aa in main () at gdb-test.c:11
11 tot = tot + 0xffffffff/out;

是的,如上输出的第一行内容所示,这就是抛出异常的地方。当我再次尝试运行s 命令时,问题最终也得到了确认:

(gdb) s

Program terminated with signal SIGFPE, Arithmetic exception.
The program no longer exists.

通过这种方式,你就可以使用 GDB 调试你的程序。

总结

GDB 提供了很多功能供用户研究和使用,在这里,我们仅仅只介绍了很少一部分内容。通过 GDB 的手册页可以进一步了解这个工具,当你在调试代码的时候,尝试使用一下它。GDB 调试器有一定的学习难度,但是它很值得你下功夫学习。

Das obige ist der detaillierte Inhalt vonDas Evangelium des Debuggens von C-Programmen unter Linux – gdb. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:lxlinux.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen