Segmentierungsfehler (Core Dumped) - wohin? Was ist es? und warum?

16

Wenn unter Linux ein Segmentierungsfehler auftritt, wird die Fehlermeldung Segmentation fault (core dumped)auf dem Terminal (falls vorhanden) ausgegeben und das Programm beendet. Als C / C ++ - Entwickler passiert mir das ziemlich oft, und ich ignoriere es normalerweise und gehe weiter gdbund erstelle meine vorherige Aktion neu, um die ungültige Speicherreferenz erneut auszulösen. Stattdessen dachte ich, ich könnte vielleicht stattdessen diesen "Kern" verwenden, da gdbdas ständige Ausführen ziemlich mühsam ist und ich den Segmentierungsfehler nicht immer wiederherstellen kann.

Meine Fragen sind drei:

  • Wo wird dieser schwer fassbare "Kern" abgeladen?
  • Was enthält es?
  • Was kann ich damit machen?
Joe
quelle
Normalerweise brauchen Sie nur den Befehl gdb path-to-your-binary path-to-corefile, info stackgefolgt von Ctrl-d. Das einzig Besorgniserregende ist, dass Core-Dumping für Sie normal ist.
ott--
Nicht so üblich , eher gelegentlich - meistens liegt es an Tippfehlern oder etwas, das ich geändert habe und dem ich das Ergebnis nicht vorgegaukelt habe.
Joe

Antworten:

16

Wenn andere Leute aufräumen ...

... findet man normalerweise nichts. Glücklicherweise hat Linux dafür einen Handler, den Sie zur Laufzeit festlegen können. In /usr/src/linux/Documentation/sysctl/kernel.txt finden Sie:

[/ proc / sys / kernel /] core_pattern wird verwendet, um einen Namen für das Core-Dumpfile-Muster anzugeben.

  • Wenn das erste Zeichen des Musters ein '|' ist, behandelt der Kernel den Rest des Musters als auszuführenden Befehl. Der Core-Dump wird nicht in eine Datei, sondern in die Standardeingabe dieses Programms geschrieben.

( danke )

Nach Angaben der Quelle wird dies von der abrt Programm (das ist Automatic Bug Reporting Tool, nicht abbrechen), aber auf meinem Arch Linux wird es von systemd erledigt. Möglicherweise möchten Sie einen eigenen Handler schreiben oder das aktuelle Verzeichnis verwenden.

Aber was ist da drin?

Nun, was es enthält, ist systemspezifisch, aber gemäß der allwissenden Enzyklopädie :

[Ein Core Dump] besteht aus dem aufgezeichneten Zustand des Arbeitsspeichers eines Computerprogramms zu einem bestimmten Zeitpunkt [...]. In der Praxis werden andere Schlüsselteile des Programmzustands gewöhnlich zur gleichen Zeit ausgegeben, einschließlich der Prozessorregister, die den Programmzähler und den Stapelzeiger, Speicherverwaltungsinformationen und andere Prozessor- und Betriebssystemflags und -informationen enthalten können.

... also enthält es im Grunde alles gdb , immer gewünscht wurde und mehr.

Ja, aber ich möchte, dass ich glücklich bin anstatt GDB

Sie können beide glücklich sein , da gdbso lange jeden Core - Dump laden, wie Sie eine exakte Kopie Ihres ausführbaren haben: gdb path/to/binary my/core.dump. Sie sollten dann in der Lage sein, das Geschäft wie gewohnt fortzusetzen und sich darüber zu ärgern, dass Sie versuchen, Fehler zu beheben, anstatt Fehler zu versuchen und zu reproduzieren.

Sebb
quelle
4

Die Kerndatei wird normalerweise aufgerufen coreund befindet sich im aktuellen Arbeitsverzeichnis des Prozesses. Es gibt jedoch eine lange Liste von Gründen, warum eine Kerndatei nicht generiert wird, und sie kann sich unter einem anderen Namen vollständig an einer anderen Stelle befinden. Weitere Informationen finden Sie in der core.5-Manpage :

BESCHREIBUNG

Die Standardaktion bestimmter Signale besteht darin, einen Prozess zum Beenden zu veranlassen und eine Core-Dump-Datei zu erstellen. Dabei handelt es sich um eine Festplattendatei, die zum Zeitpunkt der Beendigung ein Abbild des Prozessspeichers enthält. Dieses Image kann in einem Debugger (z. B. gdb (1)) verwendet werden, um den Status des Programms zum Zeitpunkt seiner Beendigung zu überprüfen. Eine Liste der Signale, die dazu führen, dass ein Prozess den Kern auslagert, finden Sie in Signal (7).

...

Unter verschiedenen Umständen wird keine Core-Dump-Datei erstellt:

   *  The process does not have permission to write the core file.  (By
      default, the core file is called core or core.pid, where pid is
      the ID of the process that dumped core, and is created in the
      current working directory.  See below for details on naming.) 
      Writing the core file will fail if the directory in which it is to
      be created is nonwritable, or if a file with the same name exists
      and is not writable or is not a regular file (e.g., it is a
      directory or a symbolic link).
   *  A (writable, regular) file with the same name as would be used for
      the core dump already exists, but there is more than one hard link
      to that file.
   *  The filesystem where the core dump file would be created is full;
      or has run out of inodes; or is mounted read-only; or the user has
      reached their quota for the filesystem.
   *  The directory in which the core dump file is to be created does
      not exist.
   *  The RLIMIT_CORE (core file size) or RLIMIT_FSIZE (file size)
      resource limits for the process are set to zero; see getrlimit(2)
      and the documentation of the shell's ulimit command (limit in
      csh(1)).
   *  The binary being executed by the process does not have read
      permission enabled.
   *  The process is executing a set-user-ID (set-group-ID) program that
      is owned by a user (group) other than the real user (group) ID of
      the process, or the process is executing a program that has file
      capabilities (see capabilities(7)).  (However, see the description
      of the prctl(2) PR_SET_DUMPABLE operation, and the description of
      the /proc/sys/fs/suid_dumpable file in proc(5).)
   *  (Since Linux 3.7) The kernel was configured without the
      CONFIG_COREDUMP option.

Außerdem kann ein Core-Dump einen Teil des Adressraums des Prozesses ausschließen, wenn das madvise (2) -MADV_DONTDUMP-Flag verwendet wurde.

Benennung von Core-Dump-Dateien

Standardmäßig wird eine Core-Dump-Datei als Core bezeichnet. In der Datei / proc / sys / kernel / core_pattern (seit Linux 2.6 und 2.4.21) kann jedoch eine Vorlage zum Benennen von Core-Dump-Dateien definiert werden. Die Vorlage kann% -Spezifizierer enthalten, die beim Erstellen einer Kerndatei durch die folgenden Werte ersetzt werden:

       %%  a single % character
       %c  core file size soft resource limit of crashing process (since
           Linux 2.6.24)
       %d  dump mode—same as value returned by prctl(2) PR_GET_DUMPABLE
           (since Linux 3.7)
       %e  executable filename (without path prefix)
       %E  pathname of executable, with slashes ('/') replaced by
           exclamation marks ('!') (since Linux 3.0).
       %g  (numeric) real GID of dumped process
       %h  hostname (same as nodename returned by uname(2))
       %i  TID of thread that triggered core dump, as seen in the PID
           namespace in which the thread resides (since Linux 3.18)
       %I  TID of thread that triggered core dump, as seen in the
           initial PID namespace (since Linux 3.18)
       %p  PID of dumped process, as seen in the PID namespace in which
           the process resides
       %P  PID of dumped process, as seen in the initial PID namespace
           (since Linux 3.12)
       %s  number of signal causing dump
       %t  time of dump, expressed as seconds since the Epoch,
           1970-01-01 00:00:00 +0000 (UTC)
       %u  (numeric) real UID of dumped process
Andrew Henle
quelle
1

In Ubuntu wird jeder Absturz in / var / crash protokolliert. Der generierte Absturzbericht kann über einen Tool-Apport entpackt werden

apport-unpack /var/crash/_crash_file.crash 'Pfad zum Entpacken'

und dann kann der Core-Dump im entpackten Bericht mit gelesen werden

gdb 'cat ExecutablePath' CoreDump

Par
quelle