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

Cuando ocurre una falla de segmentación en Linux, el mensaje de error Segmentation fault (core dumped) se imprimirá en el terminal (si lo hubiera ) y el programa finalizará. Como desarrollador de C / C ++, esto me sucede con bastante frecuencia, y generalmente lo ignoro y paso a gdb, recreando mi acción anterior para activar la referencia de memoria no válida nuevamente. En cambio, pensé que quizás podría usar este «núcleo» en su lugar, ya que ejecutar gdb todo el tiempo es bastante tedioso y no siempre puedo recrear la falla de segmentación.

Mis preguntas son tres:

  • ¿Dónde se arroja este «núcleo» escurridizo?
  • ¿Qué contiene?
  • ¿Qué puedo hacer con él?

Comentarios

  • Por lo general, solo necesita el comando gdb path-to-your-binary path-to-corefile, luego info stack seguido de Ctrl-d. Lo único preocupante es que el volcado de núcleos es algo habitual para usted.
  • No tanto habitual , sino más ocasional ; la mayoría de las veces ‘ s debido a errores tipográficos o algo que cambié y no ‘ t adelanté el resultado.

Respuesta

Si otras personas limpian …

… normalmente no encuentras nada. Pero afortunadamente Linux 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 central.

  • Si el primer carácter de el patrón es un «|», el kernel 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 )

A De acuerdo con la fuente, esto es manejado por el programa abrt (esa es la herramienta de reporte automático de errores, no abortar), pero en mi Arch Linux es manejada por systemd. Es posible que desee escribir su propio controlador o usar el directorio actual.

¿Pero qué hay allí?

Ahora lo que contiene es específico del sistema, pero de acuerdo con la enciclopedia que todo lo sabe :

[Un volcado de memoria] 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 descargan al mismo tiempo, incluidos los registros del procesador, que pueden incluir el contador del programa y el puntero de pila, información de administración de memoria, y otros indicadores e información del procesador y del sistema operativo.

… así que básicamente contiene todo gdb alguna vez querido y más.

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

Ambos pueden ser felices desde gdb cargará cualquier volcado del núcleo siempre que tenga una copia exacta de su ejecutable: gdb path/to/binary my/core.dump. Entonces debería poder continuar con sus negocios como de costumbre y sentirse molesto al intentar y no poder corregir errores en lugar de intentar y no reproducirlos.

Respuesta

Además, si ulimit -c devuelve 0, no se escribirá ningún archivo de volcado del núcleo.

Consulte ¿Dónde buscar el archivo principal generado por el bloqueo de una aplicación Linux?

También puede activar un volcado del núcleo manualmente con CTRL \ que cierra el proceso y provoca un volcado del núcleo.

Respuesta

El archivo principal normalmente se llama core y se encuentra en el directorio de trabajo actual del proceso. Sin embargo, existe una larga lista de razones por las que no se generaría un archivo principal, y es posible que esté ubicado en otro lugar completamente, con un nombre diferente. Consulte la página de manual de core.5 para obtener 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 , a archivo de disco que contiene una imagen de la memoria del proceso en el momento de la terminación. Esta imagen se puede usar en un depurador (por ejemplo, gdb (1)) para inspeccionar el estado del programa en el momento en que terminó. En signal (7) se puede encontrar una lista de las señales que hacen que un proceso descargue el núcleo.

Hay varias circunstancias en las que no se produce un archivo de volcado del 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 del núcleo puede excluir parte del espacio de direcciones del proceso si el madvise ( 2) Se utilizó el indicador MADV_DONTDUMP.

Denominación de archivos de volcado de núcleo

De forma predeterminada, un archivo de volcado de núcleo se llama core, 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 usa para nombrar archivos de volcado de núcleo. La plantilla puede contener% especificadores que se sustituyen por los siguientes valores cuando se crea un archivo principal:

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

Respuesta

En Ubuntu, cualquier falla que ocurra se registra en / var / crash. El informe de fallas generado se puede descomprimir usando una herramienta apport

apport-unpack /var/crash/_crash_file.crash «ruta para descomprimir»

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

gdb «cat ExecutablePath «CoreDump

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *