Erreur de segmentation (core dumped) - où? qu'Est-ce que c'est? et pourquoi?

16

Lorsqu'un défaut de segmentation se produit sous Linux, le message d'erreur Segmentation fault (core dumped)sera imprimé sur le terminal (le cas échéant) et le programme sera arrêté. En tant que développeur C / C ++, cela m'arrive assez souvent, et je l'ignore généralement et passe à autre chose gdb, recréant mon action précédente afin de déclencher à nouveau la référence de mémoire non valide. Au lieu de cela, j'ai pensé que je pourrais peut-être utiliser ce "noyau" à la place, car courir gdbtout le temps est plutôt fastidieux et je ne peux pas toujours recréer l'erreur de segmentation.

Mes questions sont trois:

  • Où est ce «noyau» insaisissable jeté?
  • Que contient-il?
  • Que puis-je en faire?
Joe
la source
Habituellement, vous n'avez besoin que de la commande gdb path-to-your-binary path-to-corefile, puis info stackde Ctrl-d. La seule chose inquiétante est que le core-dumping est une chose habituelle pour vous.
ott--
Pas tellement habituel , plus occasionnel - la plupart du temps, c'est à cause de fautes de frappe ou de quelque chose que j'ai changé et qui n'a pas anticipé le résultat.
Joe

Réponses:

16

Si d'autres personnes nettoient ...

... vous ne trouvez généralement rien. Mais heureusement, Linux a un gestionnaire pour cela que vous pouvez spécifier lors de l'exécution. Dans /usr/src/linux/Documentation/sysctl/kernel.txt, vous trouverez:

[/ proc / sys / kernel /] core_pattern est utilisé pour spécifier un nom de modèle de fichier de vidage principal.

  • Si le premier caractère du modèle est un «|», le noyau traitera le reste du modèle comme une commande à exécuter. Le vidage de mémoire sera écrit dans l'entrée standard de ce programme plutôt que dans un fichier.

( merci )

Selon la source, cela est géré par le abrt programme (c'est l'outil de rapport automatique de bogues, pas abandonné), mais sur mon Arch Linux, il est géré par systemd. Vous voudrez peut-être écrire votre propre gestionnaire ou utiliser le répertoire courant.

Mais qu'y a-t-il là-dedans?

Ce qu'il contient est spécifique au système, mais selon l'encyclopédie omnisciente :

[Un vidage de mémoire] consiste en l'état enregistré de la mémoire de travail d'un programme informatique à un moment précis [...]. En pratique, d'autres éléments clés de l'état du programme sont généralement vidés en même temps, y compris les registres du processeur, qui peuvent inclure le compteur de programme et le pointeur de pile, les informations de gestion de la mémoire et d'autres indicateurs et informations du processeur et du système d'exploitation.

... donc il contient essentiellement tout gdb que vous toujours voulu, et plus encore.

Oui, mais j'aimerais que je sois heureux au lieu de gdb

Vous pouvez aussi bien être heureux car gdbchargera une décharge de base aussi longtemps que vous avez une copie exacte de votre exécutable: gdb path/to/binary my/core.dump. Vous devriez alors pouvoir continuer comme d'habitude et être ennuyé en essayant et en échouant de corriger les bogues au lieu d'essayer et de ne pas reproduire les bogues.

Sebb
la source
4

Le fichier principal est normalement appelé coreet se trouve dans le répertoire de travail actuel du processus. Cependant, il existe une longue liste de raisons pour lesquelles un fichier core ne serait pas généré, et il peut se trouver entièrement ailleurs, sous un nom différent. Voir la page de manuel core.5 pour plus de détails:

LA DESCRIPTION

L'action par défaut de certains signaux est de provoquer l'arrêt d'un processus et de produire un fichier de vidage de mémoire , un fichier disque contenant une image de la mémoire du processus au moment de l'arrêt. Cette image peut être utilisée dans un débogueur (par exemple, gdb (1)) pour inspecter l'état du programme au moment où il s'est terminé. Une liste des signaux qui provoquent un processus de vidage du cœur peut être trouvée dans le signal (7).

...

Il existe diverses circonstances dans lesquelles un fichier de vidage de mémoire n'est pas produit:

   *  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.

De plus, un vidage de mémoire peut exclure une partie de l'espace d'adressage du processus si l'indicateur madvise (2) MADV_DONTDUMP a été utilisé.

Dénomination des fichiers de vidage de mémoire

Par défaut, un fichier de vidage de mémoire est nommé core, mais le fichier / proc / sys / kernel / core_pattern (depuis Linux 2.6 et 2.4.21) peut être défini pour définir un modèle utilisé pour nommer les fichiers de vidage de mémoire. Le modèle peut contenir des spécificateurs% qui sont remplacés par les valeurs suivantes lors de la création d'un fichier core:

       %%  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
la source
2

Dans Ubuntu, tout crash qui se produit est connecté à / var / crash. Le rapport d'erreur généré peut être décompressé à l'aide d'un outil de répartition

alloc-unpack /var/crash/_crash_file.crash 'chemin pour décompresser'

puis le vidage de mémoire dans le rapport décompressé peut être lu en utilisant

gdb 'cat ExecutablePath' CoreDump

par
la source