Falla de segmentación (núcleo volcado): ¿hacia dónde? ¿Qué es? ¿y por qué?

16

Cuando se produce un error de segmentación en Linux, el mensaje de error Segmentation fault (core dumped)se imprimirá en el terminal (si corresponde) y el programa finalizará. Como desarrollador de C / C ++, esto me sucede con bastante frecuencia, y generalmente lo ignoro y sigo adelante gdb, recreando mi acción anterior para activar nuevamente la referencia de memoria no válida. En cambio, pensé que tal vez podría usar este "núcleo", ya que ejecutar gdbtodo el tiempo es bastante tedioso y no siempre puedo recrear la falla de segmentación.

Mis preguntas son tres:

  • ¿Dónde se deja este elusivo "núcleo"?
  • Que contiene
  • ¿Qué puedo hacer con eso?
Joe
fuente
Por lo general, solo necesita el comando gdb path-to-your-binary path-to-corefile, info stackseguido de Ctrl-d. Lo único preocupante es que el volcado del núcleo es algo habitual para usted.
ott--
No es tan habitual , es más ocasional : la mayoría de las veces se debe a errores tipográficos o algo que cambié y no evité el resultado.
Joe

Respuestas:

16

Si otras personas limpian ...

... generalmente no encuentras nada. Pero, afortunadamente, Linux tiene un controlador para esto que puede especificar en tiempo de ejecución. En /usr/src/linux/Documentation/sysctl/kernel.txt encontrará:

[/ proc / sys / kernel /] core_pattern se usa para especificar un nombre de patrón de archivo de volcado de núcleo.

  • Si el primer carácter del patrón es un '|', el núcleo tratará el resto del patrón como un comando para ejecutar. El volcado del núcleo se escribirá en la entrada estándar de ese programa en lugar de en un archivo.

( gracias )

De acuerdo con la fuente de esto es manejado por el abrtprograma (que es automática Bug Reporting Tool, no de aborto), pero en mi Arch Linux que es manejado por systemd. Es posible que desee escribir su propio controlador o utilizar el directorio actual.

¿Pero qué hay allí?

Ahora lo que contiene es específico del sistema, pero según la enciclopedia que todo lo sabe :

[Un volcado de núcleo] consiste en el estado registrado de la memoria de trabajo de un programa de computadora en un momento específico [...]. En la práctica, otras partes clave del estado del programa generalmente se vuelcan al mismo tiempo, incluidos los registros del procesador, que pueden incluir el contador del programa y el puntero de la pila, la información de gestión de memoria y otros indicadores e información del procesador y del sistema operativo.

... así que básicamente contiene todo lo que gdbsiempre quisiste y más.

Sí, pero me gustaría que fuera feliz en lugar de gdb

Ambos pueden ser felices ya que gdbse cargará ningún volcado de memoria, siempre y cuando usted tiene una copia exacta de su ejecutable: gdb path/to/binary my/core.dump. Debería poder continuar con los negocios como de costumbre y sentirse molesto al intentar y no corregir los errores en lugar de intentar y no reproducirlos.

Sebb
fuente
4

El archivo principal normalmente se llama corey se encuentra en el directorio de trabajo actual del proceso. Sin embargo, hay una larga lista de razones por las que no se generaría un archivo principal, y puede estar ubicado en otro lugar completamente diferente, con un nombre diferente. Vea la página del manual de core.5 para más detalles:

DESCRIPCIÓN

La acción predeterminada de ciertas señales es hacer que un proceso finalice y produzca un archivo de volcado de núcleo , un archivo de disco que contiene una imagen de la memoria del proceso en el momento de la finalización. Esta imagen se puede usar en un depurador (por ejemplo, gdb (1)) para inspeccionar el estado del programa en el momento en que finalizó. Puede encontrar una lista de las señales que hacen que un proceso descargue el núcleo en la señal (7).

...

Hay varias circunstancias en las que no se produce un archivo de volcado de núcleo:

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

Además, un volcado de núcleo puede excluir parte del espacio de direcciones del proceso si se utilizó el indicador madvise (2) MADV_DONTDUMP.

Nombramiento de archivos de volcado de núcleo

Por defecto, un archivo de volcado de núcleo se denomina núcleo, pero el archivo / proc / sys / kernel / core_pattern (desde Linux 2.6 y 2.4.21) se puede configurar para definir una plantilla que se utiliza para nombrar los archivos de volcado de núcleo. La plantilla puede contener% especificadores que son sustituidos por los siguientes valores cuando se crea un archivo central:

       %%  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
fuente
1

En Ubuntu, cualquier bloqueo que ocurra se registra en / var / crash. El informe de bloqueo generado se puede desempaquetar utilizando una herramienta

apport-unpack /var/crash/_crash_file.crash 'ruta para desempaquetar'

y luego el volcado del núcleo en el informe desempaquetado se puede leer usando

gdb 'cat ExecutablePath' CoreDump

par
fuente