2009-04-22 28 views
9

A veces, cuando ejecuto mi código, se genera un archivo de volcado de núcleo cuando termino el programa por Ctrl + \. El nombre del archivo es de la forma core.*. El programa no finaliza abruptamente y no hay falla de segmentación. Creo que es SIGQUIT y no SIGABRT o SIGSEGV. Si intento Ctrl +C, o Ctrl +Z, entonces no se genera.¿Por qué se generan archivos de volcado de núcleo?

Puede alguien decir por qué se genera sólo cuando se pulsa Ctrl + \? ¿Cómo puedo evitar que se genere este archivo de volcado del núcleo? ¿Hay algún uso para el archivo de núcleo descargado?

+0

Cuando dices "ejecutar mi código", ¿estás hablando de cuando ejecutas make? ¿O cuando ejecutas el binario compilado? – harto

Respuesta

17

Un proceso descarga el núcleo cuando el sistema operativo lo finaliza debido a un error en el programa. La razón más típica por la que esto ocurre es porque el programa accedió a un valor de puntero no válido. Dado que tiene un volcado esporádico, es probable que esté utilizando un puntero no inicializado.

¿Puedes publicar el código que está causando la falla? Aparte de generalizaciones vagas, es difícil adivinar qué está mal sin ver el código.

En cuanto a lo que es un volcado de memoria en realidad es, echa un vistazo a este artículo de Wikipedia:

+5

En Linux, Ctrl + \ provoca un volcado del núcleo, incluso si el programa no tiene fallas y funciona correctamente en el momento de la terminación. – ely

5

Es una herramienta para ayudar en la depuración de una aplicación que se portan mal. Es grande porque contiene el contenido de todas las aplicaciones de memoria física en el momento de su muerte, así como los estados de registro y las pilas de todos sus hilos.

Se generan cuando el núcleo mata a una aplicación por hacer algo malo, como generar una violación de segmentación o un error de bus.

+0

Hum ... Solo contiene un volcado de la memoria del proceso, pero aún así puede ser bastante memoria. – Ben

7

Los volcados del núcleo se generan cuando el proceso recibe ciertas señales, como SIGSEGV, que los núcleos le envían cuando accede a la memoria fuera de su espacio de direcciones. Por lo general, esto sucede debido a errores en cómo se usan los punteros. Eso significa que hay un error en el programa.

El volcado del núcleo es útil para encontrar el error. Es una imagen de la memoria del proceso en el momento del problema, por lo que se puede usar un depurador como gdb para ver qué estaba haciendo el programa en ese momento. El depurador incluso puede acceder (a veces) a los valores de las variables en el programa.

Puede evitar que ocurran vuelcos de núcleo utilizando el comando ulimit.

10

Como dijeron otros antes del volcado del núcleo es el resultado de una falla en el programa.

Puede configurar si se va a generar un volcado del núcleo con el comando ulimit. Ingresando

ulimit -c 0 

deshabilita la generación del archivo central en el shell activo.

Si el programa que generó el núcleo se construye con información de símbolos se puede hacer un post mortem debugging session así:

gdb <pathto/executable> --core <corefilename> 
2

Puede evitar la creación de un archivo de volcado de memoria escribiendo código que no se desplome :)

En serio, los volcados del núcleo son útiles porque se puede ver el estado del programa cuando se bloqueó, para la depuración "post mortem". Puede abrirlos en gdb e inspeccionar el estado de su programa (especialmente si fue creado con depuración).

Los volcados de núcleo generalmente se obtienen si el programa tiene un SIGSEGV (generalmente causado por desreferenciación de puntero no válida), SIGABRT (que sucedería si llamaras abort(), o en C++ por el manejador terminte() predeterminado para excepciones en destructores etc.) o alguna otra falla. También puede activarlos explícitamente con el depurador o programáticamente.

Si ha solucionado todos los errores y es perfecto, puede eliminarlos. Además, si ha cambiado su programa de alguna manera (y lo ha recompilado), entonces será inútil ya que la información de depuración ahora no coincidirá con lo que está en el volcado del núcleo, por lo que también puede eliminarlos.

6

ctrl + \ envía la señal SIGQUIT al proceso. De acuerdo con el estándar POSIX.1, la acción predeterminada para esta señal es generar un núcleo.

SIGILL, SIGABRT, SIGFPE, SIGSEGV son otros casos en que el sistema generará un núcleo.

Consulte "man 7 signal" en su sistema para obtener más información.

1

El punto de Ctrl + \ es generar un volcado de memoria. Eso es lo que hace SIGQUIT. Si no desea que se genere, use Ctrl + C (SIGINT) en su lugar. Si el programa en cuestión no responde al SIGINT pero necesita eliminarlo del terminal, usted o el desarrollador está haciendo algo mal.

programas diseñados no a matar desde el terminal con Ctrl +C todavía debe responder con gracia a SIGTERM, que puede ser activado en otro terminal a través de kill -TERM .... Si todo lo demás falla, SIGKILL forzará una terminación inmediata.

Cuestiones relacionadas