Mientras ejecuto un programa en C, dice "(núcleo volcado)" pero no puedo ver ningún archivo en la ruta actual.
He configurado y verificado el ulimit
:
ulimit -c unlimited
ulimit -a
También traté de encontrar un archivo llamado "core", pero ¿no obtuve el archivo volcado?
Cualquier ayuda, ¿dónde está mi archivo principal?
/proc/sys/kernel/core_pattern
con una cadena que comienza,/tmp
entonces ahí es donde irán sus volcados de núcleo.Respuestas:
Lea /usr/src/linux/Documentation/sysctl/kernel.txt .
En lugar de escribir el volcado del núcleo en el disco, su sistema está configurado para enviarlo al
abrt
programa. La herramienta automatizada de informes de errores posiblemente no esté tan documentada como debería ...En cualquier caso, la respuesta rápida es que debería poder encontrar su archivo principal
/var/cache/abrt
, donde loabrt
almacena después de ser invocado. Del mismo modo, otros sistemas que utilizan Apport pueden eliminar núcleos/var/crash
, etc.fuente
/var/spool/abrt/
lugar de/var/cache/abrt
/var/lib/systemd/coredump/
En Ubuntu reciente (12.04 en mi caso), es posible que se imprima "Fallo de segmentación (núcleo volcado)", pero no se produjo ningún archivo central donde podría esperar uno (por ejemplo, para un programa compilado localmente).
Esto puede suceder si tiene un tamaño de archivo núcleo ulimit de 0 (no lo ha hecho
ulimit -c unlimited
): este es el valor predeterminado en Ubuntu. Normalmente, eso suprimiría el "(núcleo volcado)", indicándote tu error, pero en Ubuntu, los archivos centrales se canalizan a Apport (el sistema de informe de fallos de Ubuntu) a través de/proc/sys/kernel/core_pattern
, y esto parece causar el mensaje engañoso.Si Apport descubre que el programa en cuestión no es uno para el que debería informar fallas (que puede ver sucediendo
/var/log/apport.log
), recurre a la simulación del comportamiento predeterminado del kernel de colocar un archivo central en el cwd (esto se hace en el script/usr/share/apport/apport
) Esto incluye honrar a ulimit, en cuyo caso no hace nada. Pero (supongo) en lo que respecta al kernel, se generó un corefile (y se canalizó para distribuirlo), de ahí el mensaje "Fallo de segmentación (core volcado)".En última instancia, PEBKAC por olvidarse de establecer ulimit, pero el mensaje engañoso me hizo pensar que me estaba volviendo loco por un tiempo, preguntándome qué estaba comiendo mis archivos principales.
(Además, en general, la página del manual principal (5)
man 5 core
- es una buena referencia de dónde termina su archivo principal y las razones por las que podría no estar escrito).fuente
sudo service apport stop
--- después de ejecutarlo, cambió/proc/sys/kernel/core_pattern
de la tubería de distribución a solocore
.core_pattern
Supongo que Apport es lo suficientemente inteligente como para arreglarlo temporalmente.Con el lanzamiento de systemd , también hay otro escenario. Por defecto, systemd almacenará los volcados del núcleo en su diario, siendo accesible con el
systemd-coredumpctl
comando. Definido en el archivo core_pattern:Este comportamiento se puede deshabilitar con un simple "hack":
Como siempre, el tamaño de los volcados del núcleo debe ser igual o mayor que el tamaño del núcleo que se está volcando, como se hace por ejemplo
ulimit -c unlimited
.fuente
ulimit -c unlimited
.50-coredump.conf
lugar decoredump.conf
. Esto debería anular/lib/sysctl.d/50-coredump.conf
. El defecto puede restaurarse consysctl -w kernel.core_pattern=core
sudo service apport stop
Escribir instrucciones para obtener un volcado de núcleo en Ubuntu 16.04 LTS :
Como @jtn ha mencionado en su respuesta, los delegados de Ubuntu la visualización de los accidentes de apport , que a su vez se niega a escribir el volcado porque el programa no es un paquete instalado.
Para solucionar el problema, debemos asegurarnos de que apport también escriba archivos de volcado de núcleo para programas que no sean paquetes . Para hacerlo, cree un archivo llamado ~ / .config / apport / settings con el siguiente contenido:
[main] unpackaged=true
[Opcional] Para que gdb pueda leer los volcados, ejecuta el siguiente comando:
apport-unpack <location_of_report> <target_directory>
Referencias: Core_dump - Oracle VM VirtualBox
fuente
Podría pensar en las siguientes dos posibilidades:
Como otros ya han señalado, el programa podría
chdir()
. ¿El usuario que ejecuta el programa puede escribir en el directorio en el quechdir()
está editado? Si no, no puede crear el volcado del núcleo.Por alguna extraña razón, el volcado del núcleo no se llama
core.*
Puede verificar/proc/sys/kernel/core_pattern
eso. Además, el comando de búsqueda que nombró no encontraría un volcado de núcleo típico. Debe usarfind / -name "*core.*"
, ya que el nombre típico del coredump escore.$PID
fuente
Si le faltan volcados de núcleo para los archivos binarios
RHEL
y cuando los usaabrt
, asegúrese de que/etc/abrt/abrt-action-save-package-data.conf
contiene
Esto permite la creación de informes de fallos (incluidos los volcados de núcleo) para archivos binarios que no forman parte de los paquetes instalados (por ejemplo, compilados localmente).
fuente
Para fedora25, podría encontrar el archivo central en
donde
ccpp-2017-02-16-16:36:51-2974" is pattern "%s %c %p %u %g %t %P %
según `/ proc / sys / kernel / core_pattern 'fuente
Mis esfuerzos en WSL no han tenido éxito.
Para aquellos que se ejecutan en el Subsistema de Windows para Linux (WSL), parece haber un problema abierto en este momento por la falta de archivos de volcado del núcleo.
Los comentarios indican que
Problema de Github
Comentarios del desarrollador de Windows
fuente
En Ubuntu18.04, la forma más fácil de obtener un archivo central es ingresar el comando a continuación para detener el servicio de distribución.
Luego vuelva a ejecutar la aplicación, obtendrá el archivo de volcado en el directorio actual.
fuente
Estoy en Linux Mint 19 (basado en Ubuntu 18). Quería tener
coredump
archivos en la carpeta actual. Tenía que hacer dos cosas:/proc/sys/kernel/core_pattern
(por# echo "core.%p.%s.%c.%d.%P > /proc/sys/kernel/core_pattern
o por# sysctl -w kernel.core_pattern=core.%p.%s.%c.%d.%P)
$ ulimit -c unlimited
Eso ya estaba escrito en las respuestas, pero escribí para resumir sucintamente. Curiosamente, el cambio de límite no requería privilegios de root (según /ubuntu/162229/how-do-i-increase-the-open-files-limit-for-a-non-root-user non- root solo puede reducir el límite, por lo que fue inesperado; los comentarios al respecto son bienvenidos).
fuente
ulimit -c unlimited
hizo que el archivo principal apareciera correctamente en el directorio actual después de un "núcleo volcado".fuente