Core volcado, pero el archivo core no está en el directorio actual?

277

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?

webminal.org
fuente
1
¿El programa invoca a chdir en algún momento? Si es así, mira allí.
William Pursell
2
¿El programa cambia su directorio de trabajo? Mira allí.
Richard Pennington
Buscaría en
1
oops no, no está allí ... Lo comprobé ... programé chdir a / mnt y / verifiqué ambos directorios pero no pude encontrar el archivo. Incluso encontré / -name "* core". incluso esto no me mostró el archivo. El programa usa C + sqlite, mientras inserta valores que volca el núcleo. Dijo error de aserción == 0 por primera vez y error = 101 por segunda vez ..
webminal.org
8
Sí, si anula /proc/sys/kernel/core_patterncon una cadena que comienza, /tmpentonces ahí es donde irán sus volcados de núcleo.
Ephemient

Respuestas:

240

Lea /usr/src/linux/Documentation/sysctl/kernel.txt .

[/ 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.

En lugar de escribir el volcado del núcleo en el disco, su sistema está configurado para enviarlo al abrtprograma. 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 lo abrtalmacena después de ser invocado. Del mismo modo, otros sistemas que utilizan Apport pueden eliminar núcleos /var/crash, etc.

efímero
fuente
30
sí, he editado core_pattern con el siguiente contenido echo "core.% e.% p"> / proc / sys / kernel / core_pattern ... ahora crea el archivo de volcado del núcleo en el directorio actual. con el nombre "core.giis.12344" etc. Gracias a todos por sus respuestas / comentarios / sugerencias.
webminal.org
20
Solo para tener en cuenta que el programa abrt de fedora 18 está almacenando volcados de núcleo en /var/spool/abrt/lugar de/var/cache/abrt
Nelson
44
¿Hay alguna manera de permitir a los usuarios configurar esto por sí mismos, en lugar de que todos tengan que usar la configuración del sistema?
allyourcode
Cuando se ejecuta este comando y se invoca el proceso, ¿stdout y stderr no se abren de manera predeterminada? Veo cosas muy extrañas sucediendo. cuando uso dup2 de stderr y stdout en mi archivo personalizado (applog.txt), los datos que estoy escribiendo en otro archivo (mycore.BIN) se redirigen al archivo que he usado para capturar stdout & stderr (applog.txt) . ¿Hay una buena lectura sobre este? Por favor recomiende. Gracias
mk ..
20
systemd en coredumps de la tienda archlinux en/var/lib/systemd/coredump/
Francois
224

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

jtn
fuente
44
Muchas gracias, me encontré con el mismo problema. Por cierto, Ubuntu 14.04 exhibe exactamente el mismo comportamiento que el que describiste.
Malte Skoruppa
55
En mi instalación de Ubuntu (modificada 14.04), hay una solución temporal fácil para esto ejecutando sudo service apport stop--- después de ejecutarlo, cambió /proc/sys/kernel/core_patternde la tubería de distribución a solo core. core_patternSupongo que Apport es lo suficientemente inteligente como para arreglarlo temporalmente.
Patrick Collins
66
"ulimit -c unlimited" es exactamente lo que necesitaba. ¡Gracias!
Dave C
44
He intentado todas las respuestas aplicables, y cada ubicación en cada comentario aquí después de hacer el comando ulimit, pero aún no puedo encontrar un archivo central en mi Ubuntu 16.04 LTS ...
Nagev 05 de
2
@ Electric Goat No, no lo he hecho. Es pobre diseño UX, IMO. El sistema solo debe imprimir la ruta o no imprimir un mensaje si no se está creando. Agregaré mi propia respuesta, cuando o si tengo la oportunidad de investigar esto más a fondo.
Nagev
80

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-coredumpctlcomando. Definido en el archivo core_pattern:

$ cat /proc/sys/kernel/core_pattern 
|/usr/lib/systemd/systemd-coredump %p %u %g %s %t %e

Este comportamiento se puede deshabilitar con un simple "hack":

$ ln -s /dev/null /etc/sysctl.d/50-coredump.conf
$ sysctl -w kernel.core_pattern=core      # or just reboot

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.

timss
fuente
Ese "hack" no funcionó para mí (incluso después de un reinicio). Estoy ejecutando Arch Linux y ya lo he hecho ulimit -c unlimited.
gsingh2011
@ gsingh2011 Puede estar desactualizado. Ya no ejecuto Arch, así que no puedo decir si debería funcionar en estos días. Si lo resuelve, no dude en actualizarme / nosotros con un nuevo comentario.
timss
55
@ gsingh2011 Probar en 50-coredump.conflugar de coredump.conf. Esto debería anular /lib/sysctl.d/50-coredump.conf. El defecto puede restaurarse consysctl -w kernel.core_pattern=core
Lekensteyn
Tuve que apagar appport para que esto funcionesudo service apport stop
rahul003
51

Escribir instrucciones para obtener un volcado de núcleo en Ubuntu 16.04 LTS :

  1. 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.Antes de hacer cambios

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

  3. Ahora bloquee su programa nuevamente y vea que sus archivos de bloqueo se generan dentro de la carpeta: / var / crash con nombres como * .1000.crash . Tenga en cuenta que gdb no puede leer estos archivos directamente.Después de hacer cambios
  4. [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

ankurrc
fuente
3
Esta es la única solución que funcionó para mí en Ubuntu 18.04
greuze
¿A qué usuario pertenece ~ /? Si el proceso se ejecuta desde la raíz, ¿eso significa /root/.config/apport/settings?
Nicholi
@Nicholi Creo que debería ser el usuario el que ejecutó el programa. Aunque no estoy seguro.
ankurrc
12

Podría pensar en las siguientes dos posibilidades:

  1. Como otros ya han señalado, el programa podría chdir(). ¿El usuario que ejecuta el programa puede escribir en el directorio en el que chdir()está editado? Si no, no puede crear el volcado del núcleo.

  2. Por alguna extraña razón, el volcado del núcleo no se llama core.*Puede verificar /proc/sys/kernel/core_patterneso. Además, el comando de búsqueda que nombró no encontraría un volcado de núcleo típico. Debe usar find / -name "*core.*", ya que el nombre típico del coredump escore.$PID

ahans
fuente
aquí está mi patrón: ¿significa esto que el archivo central se llama algo así como "PID.signal.userid" en lugar de core.pid ??? $ cat / proc / sys / kernel / core_pattern / usr / lib / hookCCpp / var / char / abrt% p% s% u
webminal.org
9

Si le faltan volcados de núcleo para los archivos binarios RHELy cuando los usa abrt, asegúrese de que/etc/abrt/abrt-action-save-package-data.conf

contiene

ProcessUnpackaged = yes

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

MRalwasser
fuente
6

Para fedora25, podría encontrar el archivo central en

/var/spool/abrt/ccpp-2017-02-16-16:36:51-2974/coredump

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 '

Mahaveer Darade
fuente
5

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

Este es un problema conocido que conocemos, es algo que estamos investigando.

Problema de Github

Comentarios del desarrollador de Windows

Brandon Søren Culley
fuente
5

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.

sudo service apport stop

Luego vuelva a ejecutar la aplicación, obtendrá el archivo de volcado en el directorio actual.

Nicolas Gong
fuente
3

Estoy en Linux Mint 19 (basado en Ubuntu 18). Quería tener coredumparchivos en la carpeta actual. Tenía que hacer dos cosas:

  1. Cambio /proc/sys/kernel/core_pattern(por # echo "core.%p.%s.%c.%d.%P > /proc/sys/kernel/core_patterno por# sysctl -w kernel.core_pattern=core.%p.%s.%c.%d.%P)
  2. Aumento del límite para el tamaño del archivo central en $ 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).

Marisha
fuente
2

ulimit -c unlimited hizo que el archivo principal apareciera correctamente en el directorio actual después de un "núcleo volcado".

Nicolas VERHELST
fuente