Explicación: cuando se produce un error de segmentación, cómo el sistema Linux genera el archivo central

  


El programa C en Linux a menudo causa un fallo de segmento debido a errores de acceso a la memoria, etc., si la función de volcado de memoria del sistema es Abierto, luego se descargará una imagen de memoria en el disco duro, luego puede usar gdb para analizar el archivo del núcleo y restaurar la situación de la pila cuando el sistema tiene un error de segmentación. Esto es muy útil para nosotros para encontrar errores.
Utilice ulimit -a para ver el límite de tamaño del archivo del núcleo del sistema; use ulimit -c [kbytes] para establecer el tamaño del archivo del núcleo que el sistema puede generar, por ejemplo,
ulimit -c 0 no genera el archivo del núcleo
ulimit - c 100 Establezca el archivo del núcleo en un máximo de 100k
ulimit -c ilimitado No limite el tamaño del archivo del núcleo
Busque un programa que cause un error de segmentación:
#include
int main ()
{< Br> char * ptr = " linuxers.cn ";
* ptr = 0;
}
El resultado de compilar y ejecutar es el siguiente:
[leconte @ localhost test] $ gcc -g -o test Ac
[leconte @ localhost test] $ ./test
Segment Error
No hay un archivo central generado en este momento, luego use ulimit -c para establecer el tamaño del archivo principal en ilimitado, luego ejecute el programa ./test. El resultado es el siguiente:
[leconte @ localhost ~] $ ulimit -a
tamaño del archivo principal (bloques, -c) 0
[leconte @ localhost test] $ ulimit -c ilimitado
[leconte @ Prueba de host local] $ ulimit -a
tamaño del archivo del núcleo (bloques, -c) ilimitado
[prueba de leconte @ localhost] $ ./test
volcado de segmento (volcado del núcleo)
[leconte @ loc Alhost test] $ ls -al core. *
-rw ------- 1 leconte leconte 139264 01-06 22:31 core.2065
Se ha generado un archivo del núcleo visible, luego se analiza el gdb , vea la situación de la pila:
[leconte @ localhost test] $ gdb ./test core.2065
GNU gdb Fedora (6.8-27.el5)
Copyright (C) 2008 Free Software Foundation, Inc. < Br> Licencia GPLv3 +: GNU GPL versión 3 o posterior
Este es un software gratuito: usted es libre de cambiarlo y redistribuirlo.
NO HAY GARANTÍA, en la medida permitida por la ley. Escriba " mostrar copia " Br> y " muestran la garantía " para obtener más detalles.
Este GDB se configuró como " i386-redhat-linux-gnu " ... | advertencia: el archivo exec es más nuevo que el archivo principal.
advertencia: No se puede leer la ruta de acceso para el mapa de carga: Error de entrada /salida.
Lectura de símbolos desde /lib/libc.so.6...done.
Símbolos cargados para /lib/libc.so.6
Lectura de símbolos desde /lib/ld-linux.so.2...done.
Símbolos cargados para /lib/ld-linux.so.2
El núcleo fue generado por `./test '.
Plazo del programa Inated con la señal 11, falla de segmentación.
[Nuevo proceso 2065]
# 0 0x0804836f en main () en ac: 6
6 * ptr = 0;
Está claro desde la salida anterior El error de segmentación ocurrió en la línea 6 de CA y el problema ha sido claramente localizado.
Muchos de los tamaños de archivo del núcleo por defecto del sistema son 0, podemos especificar el tamaño del archivo del núcleo agregando el comando ulimit -c en el script de inicio de shell /etc /bashrc o ~ /.bashrc, etc., para garantizar que el archivo del núcleo pueda Generado
Además, también puede configurar la plantilla de nombre de archivo del archivo principal en /proc /sys /kernel /core_pattern. Para obtener más información, consulte la página de manual oficial del núcleo.

Copyright © Conocimiento de Windows All Rights Reserved