El archivo de volcado del núcleo no se genera

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?

Asegúrese de que su directorio actual (en el momento del locking – 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.

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:

https://wiki.ubuntu.com/Apport

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 

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 …

Además, verifique que tenga suficiente espacio en el disco en /var/core o donde sea que se escriban sus volcados centrales. 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.

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 uno está en una distribución de Linux (por ejemplo, CentOS, Debian), entonces quizás la forma más accesible de averiguar sobre los archivos principales y las condiciones relacionadas se encuentre en la página de manual. Simplemente ejecute el siguiente comando desde una terminal:

 man 5 core 

Aunque esto no va a ser un problema para la persona que hizo la pregunta, ya que ejecutaron el progtwig 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 lockings, es posible que no se genere el núcleo. Así que busca el código con algo en la línea:

 signal(SIGSEGV,  ); 

entonces el SIGSEGV será manejado por el manejador y no obtendrá el volcado del núcleo.

Si llama a daemon () y luego daemonize un proceso, de forma predeterminada el directorio de trabajo actual cambiará a / . Entonces, si su progtwig es un daemon, entonces debería buscar un núcleo en el directorio / y no en el directorio del binario.

Solo en caso de que alguien más tropiece con esto. Estaba ejecutando el código de otra persona, asegúrese de que no estén manejando la señal, para que puedan salir con gracia. Comenté el manejo y obtuve el volcado del núcleo.