So verwenden Sie gdb zum Debuggen von Kerndateien in Linux

So verwenden Sie gdb zum Debuggen von Kerndateien in Linux

1.core-Datei

Wenn während der Programmausführung ein Segmentierungsfehler (Core Dumped) auftritt, wird die Programmausführung angehalten und eine Core-Datei generiert. Die Kerndatei ist ein Speicherabbild des laufenden Zustands des Programms. Die Verwendung von gdb zum Debuggen der Kerndatei kann uns dabei helfen, schnell die Stelle zu finden, an der der Programmsegmentierungsfehler auftritt. Natürlich sollte die Kompilierungsoption -g beim Kompilieren des ausführbaren Programms hinzugefügt werden, um Debuginformationen zu generieren.

Wenn der vom Programm abgerufene Speicher den vom System bereitgestellten Speicherplatz überschreitet, tritt ein Segmentierungsfehler (Core Dump) auf. Daher sind die wichtigsten Situationen, in denen Segmentierungsfehler auftreten, folgende:

(1) Zugriff auf eine nicht vorhandene Speicheradresse;
(2) Zugriff auf systemgeschützte Speicheradressen;
(3) Array-Zugriff außerhalb der Grenzen usw.

Core Dumped wird auch Core Dump genannt. Wenn während der Programmausführung eine Ausnahme auftritt und das Programm abnormal beendet wird, speichert das Betriebssystem den aktuellen Speicherstatus des Programms in einer Core-Datei, die als Core Dumped bezeichnet wird.

Core bedeutet Kernspeicher, also ein aus Spulen bestehender Speicher. Heutzutage, wo die Halbleiterindustrie boomt, wird Kernspeicher nicht mehr verwendet. In vielen Fällen wird der Speicher jedoch immer noch als Kern bezeichnet.

2. Kontrollieren Sie, ob die Kerndatei generiert wird

(1) Verwenden Sie den Befehl ulimit -c, um den Schalter zur Kerndateigenerierung anzuzeigen. Wenn das Ergebnis 0 ist, bedeutet dies, dass diese Funktion deaktiviert ist und keine Core-Datei generiert wird.

(2) Verwenden Sie den Befehl ulimit -c filesize, um die Größe der Core-Datei zu begrenzen (die Dateigröße ist in KB angegeben). Wenn die generierten Informationen diese Größe überschreiten, werden sie abgeschnitten, was zu einer unvollständigen Kerndatei führt. Beim Debuggen dieser Kerndatei gibt gdb einen Fehler aus. Beispiel: ulimit -c 1024.

(3) Wenn ulimit -c unlimited verwendet wird, ist die Größe der Core-Datei unbegrenzt.

Der Befehl ulimit -c unlimited im Terminal ist nur eine temporäre Änderung und wird nach dem Neustart nicht mehr wirksam. Um eine dauerhafte Änderung vorzunehmen, gibt es drei Möglichkeiten:

(1) Fügen Sie eine Zeile ulimit -c unlimited in /etc/rc.local hinzu

(2) Fügen Sie eine Zeile ulimit -c unlimited in /etc/profile hinzu

(3) Fügen Sie am Ende von /etc/security/limits.conf die folgenden beiden Zeilen hinzu:

@root Softcore unbegrenzt
@root Hardcore unbegrenzt

3.core-Dateiname und Generierungspfad

Der Standarddateiname des Kerns ist core.pid, wobei sich pid auf die Prozess-ID des Programms bezieht, das den Segmentierungsfehler generiert.
Der Standardpfad ist das aktuelle Verzeichnis des Programms, das den Segmentierungsfehler verursacht hat.

Wenn Sie den Namen und den Generierungspfad der Core-Datei ändern möchten, lautet die entsprechende Konfigurationsdatei:
/proc/sys/kernel/core_uses_pid: Steuert, ob pid als Erweiterung zum Dateinamen der generierten Core-Datei hinzugefügt wird. Wenn es hinzugefügt wird, ist der Dateiinhalt 1, andernfalls 0.

/proc/sys/kernel/core_pattern: Sie können den Speicherort und den Dateinamen der formatierten Core-Datei festlegen. Der ursprüngliche Dateiinhalt lautet beispielsweise core-%e.
Sie können es folgendermaßen ändern:
echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
Die generierte Core-Datei wird im Verzeichnis /corefile gespeichert und der generierte Dateiname lautet: core-command name-pid-timestamp.

Nachfolgend sehen Sie eine Liste der Parameter:

%p - PID in Dateinamen einfügen
%u - aktuelle UID in Dateinamen einfügen
%g - aktuelle GID in Dateinamen einfügen
%s - Signal, das den Coredump verursacht hat, in den Dateinamen einfügen
%t - fügt die UNIX-Zeit, zu der der Coredump auftrat, in den Dateinamen ein. Fügt die UNIX-Zeit hinzu, zu der die Core-Datei generiert wurde.
%h – fügt den Hostnamen, auf dem der Coredump aufgetreten ist, in den Dateinamen ein
%e – fügt den Namen der ausführbaren Coredumping-Datei in den Dateinamen ein und fügt den Befehlsnamen hinzu.

Im Allgemeinen sind keine Änderungen erforderlich und die Standardeinstellungen können verwendet werden.

4. Schritte zum Debuggen von GDB-Kerndateien

Wenn Sie gdb zum Debuggen der Kerndatei verwenden, um den Speicherort des Segmentierungsfehlers im Programm zu finden, sollten Sie beachten, dass das ausführbare Programm mit der Kompilierungsbefehlsoption -g kompiliert werden muss.

Die allgemeinen Schritte zum Debuggen von GDB-Kerndateien sind wie folgt, und der erste wird empfohlen.

Konkreter Schritt eins:

(1) Starten Sie gdb und geben Sie die Core-Datei ein. Das Befehlsformat lautet: gdb [exec-Datei] [Core-Datei].
Beispielverwendung: gdb ./test test.core.

(2) Suchen Sie nach dem Aufrufen von gdb den Ort des Segmentierungsfehlers: where oder bt

Anwendungsbeispiel:

Der spezifische Speicherort der spezifischen Datei im Quellprogramm kann lokalisiert werden und es ist ein Segmentierungsfehler aufgetreten.

Konkreter Schritt 2:

(1) Starten Sie gdb und geben Sie die Core-Datei ein. Das Befehlsformat lautet: gdb –core=[Core-Datei].
Beispielverwendung: gdb –core=test.core.

(2) Geben Sie nach dem Aufrufen von gdb die Symboltabelle an, die der Kerndatei entspricht. Das Befehlsformat lautet: Datei [exec-Datei].
Anwendungsbeispiel:

Konkreter Schritt drei:

(1) Starten Sie gdb und geben Sie die Kerndatei ein. Das Befehlsformat lautet: gdb -c [Kerndatei].
Beispielverwendung: gdb -core test.core.
(2) Die weiteren Schritte sind identisch mit Schritt 2.

5. Andere Methoden zum Auffinden des Segmentierungsfehlerorts

Sie können gdb zum Debuggen in einzelnen Schritten verwenden, um den Ort des Segmentierungsfehlers zu finden. Weitere Informationen zu GDB-Anwendungsfällen finden Sie unter:
Eine kurze Einführung in die Verwendung von gdb unter Linux.

Oben finden Sie Einzelheiten zur Verwendung von gdb zum Debuggen von Kerndateien unter Linux. Weitere Informationen zum Debuggen von Kerndateien mit Linux gdb finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Erste Schritte mit GDB unter 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

<<:  Elegantere Verarbeitung von Datumsangaben in JavaScript basierend auf Day.js

>>:  So ändern Sie das Passwort des Root-Benutzers in MySQL

Artikel empfehlen

Dieser Artikel zeigt Ihnen detailliert, wie Sie SQL CASE WHEN verwenden

Inhaltsverzeichnis Einfache CASEWHEN-Funktion: Di...

Vue-Methode zum Überprüfen, ob der Benutzername verfügbar ist

In diesem Artikelbeispiel wird der spezifische Co...

MYSQL METADATA LOCK (MDL LOCK) MDL-Sperrproblemanalyse

1. Einleitung MDL-Sperren in MySQL haben schon im...

Beispiel zum Festlegen der pseudostatischen WordPress-Eigenschaft in Nginx

Zitat aus Baidus Erklärung zu Pseudostatik: Pseud...

Erklärung der horizontalen und vertikalen Tabellenpartitionierung von MySQL

In meinem vorherigen Artikel habe ich gesagt, das...

Wir zeigen Ihnen einen Trick, um einen Textvergleich unter Linux durchzuführen

Vorwort Während des Schreibens des Codes werden w...

Detaillierte Erklärung der Lösung zur Bildverformung unter Flex-Layout

Flex-Layout ist heutzutage eine häufig verwendete...

Vue implementiert das Hinzufügen eines Wasserzeicheneffekts zur Seite

Als ich kürzlich an einem Projekt arbeitete, wurd...

JavaScript zum Erzielen des JD.com-Blitzverkaufseffekts

In diesem Artikel wird der spezifische JavaScript...

Vue-cli erstellt ein Projekt und analysiert die Projektstruktur

Inhaltsverzeichnis 1. Geben Sie ein Verzeichnis e...