linux - El archivo de volcado del núcleo no se genera
gdb coredump (11)
Cada vez que se bloquea mi aplicación, no se genera un archivo de volcado del núcleo. Recuerdo que hace unos días, en otro servidor se generó. Estoy ejecutando la aplicación usando la pantalla en bash así:
#!/bin/bash
ulimit -c unlimited
while true; do ./server; done
Como puede ver, estoy usando ulimit -c unlimited
que es importante si quiero generar un volcado de memoria, pero aún no lo genera, cuando recibí un error de segmentación. ¿Cómo puedo hacer que funcione?
Además, verifique que tenga suficiente espacio en el disco en /var/core
o donde se escriban los volcados de su núcleo. Si la partición está casi llena o al 100% de uso del disco, ese sería el problema. Mis almacenes centrales tienen un promedio de algunos conciertos, así que debes asegurarte de tener al menos 5-10 gigas disponibles en la partición.
Asegúrese de que su directorio actual (en el momento del bloqueo - el server
puede cambiar directorios) sea de escritura. Si el servidor llama a setuid
, ese usuario debe poder escribir en el directorio.
Compruebe también /proc/sys/kernel/core_pattern
. Eso puede redirigir volcados del núcleo a otro directorio, y ese directorio debe ser de escritura. Más información aquí .
Este enlace contiene una buena lista de comprobación de por qué no se generan volcados centrales:
- El núcleo habría sido más grande que el límite actual.
- No tiene los permisos necesarios para volcar núcleo (directorio y archivo). Tenga en cuenta que los volcados centrales se colocan en el directorio actual del proceso de volcado, que podría ser diferente del proceso principal.
- Verifique que el sistema de archivos sea grabable y tenga suficiente espacio libre.
- Si existe un subdirectorio llamado core en el directorio de trabajo, no se vaciará ningún núcleo.
- Si ya existe un archivo llamado core pero tiene múltiples enlaces duros, el kernel no va a volcar core.
- Verifique los permisos en el ejecutable, si el ejecutable tiene los bits suid o sgid habilitados, los volcados del núcleo estarán deshabilitados por defecto. Lo mismo ocurrirá si tiene permisos de ejecución pero no permisos de lectura en el archivo.
- Verifique que el proceso no haya cambiado el directorio de trabajo, el límite de tamaño del núcleo o el indicador de dumpable.
- Algunas versiones del núcleo no pueden volcar procesos con espacio de direcciones compartido (hilos AKA). Las versiones más nuevas del núcleo pueden volcar tales procesos, pero agregarán el pid al nombre del archivo.
- El ejecutable podría estar en un formato no estándar que no admite volcados de núcleo. Cada formato ejecutable debe implementar una rutina de volcado de núcleo.
- La falla de segmentación podría ser realmente un núcleo. Vaya, revise los registros del sistema para ver si hay algún mensaje Oops.
- La aplicación llama a
exit()
lugar de usar el controlador de volcado de núcleo.
Aunque esto no va a ser un problema para la persona que hizo la pregunta, ya que ejecutaron el programa que debía producir el archivo central en un script con el comando ulimit, me gustaría documentar que el comando ulimit es específico al shell en el que lo ejecuta (como variables de entorno). Pasé demasiado tiempo ejecutando ulimit y sysctl y cosas en un shell, y el comando que quería volcar core en el otro shell, y preguntándome por qué no se produjo el archivo core.
Lo agregaré a mi bashrc. El sysctl funciona para todos los procesos una vez que se emite, pero el ulimit solo funciona para el shell en el que se emite (quizás también los descendientes), pero no para otros shells que se estén ejecutando.
Nota: Si ha escrito usted mismo un controlador de bloqueos, es posible que no se genere el núcleo. Así que busca el código con algo en la línea:
signal(SIGSEGV, <handler> );
entonces el SIGSEGV será manejado por el manejador y no obtendrá el volcado del núcleo.
Recuerde que si está iniciando el servidor desde un servicio , comenzará una sesión de bash diferente para que el ulimit no sea efectivo allí. Trata de poner esto en tu script :
ulimit -c unlimited
Las respuestas dadas aquí cubren bastante bien la mayoría de los escenarios para los que no se crea el volcado del núcleo. Sin embargo, en mi caso, ninguno de estos aplicados. Estoy publicando esta respuesta como una adición a las otras respuestas.
Si su archivo principal no se está creando por algún motivo, le recomiendo ver los / var / log / messages. Puede haber una pista sobre por qué el archivo central no se crea. En mi caso, había una línea que indicaba la causa raíz:
Executable ''/path/to/executable'' doesn''t belong to any package
Para solucionar este problema, edite /etc/abrt/abrt-action-save-package-data.conf y cambie ProcessUnpackaged de ''no'' a ''yes''.
ProcessUnpackaged = yes
Esta configuración especifica si se debe crear el núcleo para los binarios que no están instalados con el administrador de paquetes.
Si llama a daemon () y luego daemonize un proceso, de forma predeterminada el directorio de trabajo actual cambiará a /
. Entonces, si su programa es un daemon, entonces debería buscar un núcleo en el directorio /
y no en el directorio del binario.
Si uno está en una distribución de Linux (por ejemplo, CentOS, Debian), entonces tal vez la forma más accesible para conocer los archivos principales y las condiciones relacionadas se encuentre en la página del manual. Simplemente ejecute el siguiente comando desde una terminal:
man 5 core
Comprobar:
$ sysctl kernel.core_pattern
para ver cómo se crean los volcados (% e será el nombre del proceso y% t será la hora del sistema).
Si tienes Ubuntu, tus vuelcos se crean mediante la entrada en /var/crash
, pero en un formato diferente (edita el archivo para verlo).
Puedes probarlo por:
sleep 10 &
killall -SIGSEGV sleep
Si el volcado del núcleo es exitoso, verá "(núcleo volcado)" después de la indicación de falla de segmentación.
Lee mas:
Cómo generar un archivo core dump en Ubuntu
Ubuntu
Por favor, lea más en:
Para el registro, en Debian 9 Stretch ( systemd
), tuve que instalar el paquete systemd-coredump
. Posteriormente, los volcados del núcleo se generaron en la carpeta /var/lib/systemd/coredump
.
Además, estos núcleos están comprimidos en el formato lz4
. Para descomprimir, puede usar el paquete liblz4-tool
siguiente manera: lz4 -d FILE
.
Para poder depurar el coredump descomprimido usando gdb
, también tuve que cambiar el nombre del archivo completamente largo por algo más corto ...