Dirección original: https://www.cnblogs.com/flyinggod/p/13415862.html
Artículos relacionados
1. Función, configuración y uso del archivo principal ---- https://www.cnblogs.com/xiaodoujiaohome/p/6222895.html
2. Configuración del sistema Linux ulimit y generación de archivos Core: https://blog.csdn.net/zjb9605025/article/details/6553184
1 2 3 4 5 6 7 8 9 10 |
|
Método de generación de volcado de núcleo
En el entorno Linux, un proceso se bloquea debido a una excepción y, por lo general, es difícil encontrar la causa.Sin embargo, el archivo principal proporcionado por el kernel de Linux generalmente registra la información del proceso cuando falla. Sin embargo, es necesario configurar un conmutador para generar un archivo principal. Los pasos específicos son los siguientes:
1. Verifique si el interruptor para generar el archivo principal está encendido e ingrese el comando
ulimit -a
El tamaño del archivo principal en la primera línea es 0 y no está habilitado.
2. Utilice ulimit -c [kbytes] para establecer el tamaño del archivo central permitido por el sistema.
1 2 3 |
|
Ejecute el comando ulimit -c unlimited, y luego ulimit -a para ver el núcleo
De esta manera, el archivo principal se puede generar cuando el proceso falla. Este método solo puede tener efecto en el shell. Si esta configuración siempre es efectiva, debe realizar la siguiente configuración
1 2 |
|
Guarde y salga, reinicie el servidor, el archivo modificado tendrá efecto durante mucho tiempo, o
fuente / etc / profile
No reinicie el servidor, use el código fuente para que el archivo sea efectivo de inmediato.
3. Especifique la ruta y el nombre del archivo generado.
De forma predeterminada, el nombre del archivo generado por el volcado de memoria es core y se encuentra en el directorio actual del programa. El nuevo núcleo sobrescribirá el núcleo existente. Al modificar el archivo / proc / sys / kernel / core_uses_pid, puede controlar la ubicación de almacenamiento y el formato de archivo del archivo del núcleo.
vim /etc/sysctl.conf # Ingrese al modo de edición y agregue las siguientes dos líneas kernel.core_pattern = / tmp / corefile / core_% t_% e_% p kernel.core_uses_pid = 0
Cree un directorio central bajo var, use
sysctl –p /etc/sysctl.conf
La modificación entrará en vigor inmediatamente.
Los parámetros nombrados de core_pattern son los siguientes:
% c El límite superior del tamaño del archivo de volcado % e El nombre del archivo volcado % g El ID de grupo real del proceso volcado % h El nombre de host % p El PID del proceso volcado % s La señal que causó este volcado% t tiempo de volcado ( El número de segundos desde el 1 de enero de 1970) % u El ID de usuario real del proceso volcado
4. Ejecute el comando en la terminal: kill -s SIGSEGV $$, puede ver que se genera un archivo central en / tmp / corefile, lo que indica que la configuración se ha realizado correctamente.
El archivo principal no se genera en las siguientes condiciones:
1 2 3 4 |
|
Principio de generación de volcado de núcleos
Coredump generalmente ocurre cuando el proceso recibe una determinada señal. Actualmente hay más de 60 señales en Linux. Puede usar el comando kill -l para listarlas todas.
Para una señal específica, la aplicación puede escribir la función de procesamiento de señal correspondiente. Si no se especifica, se adopta el método de procesamiento predeterminado. El procesamiento predeterminado es la señal de coredump de la siguiente manera:
1 2 |
|
Vemos que SIGSEGV está en él. Generalmente, esta señal se genera cuando una matriz está fuera de límites o cuando se accede a un puntero nulo. Además, aunque este es el valor predeterminado, también puede escribir su propia función de procesamiento de señal para cambiar el comportamiento predeterminado. Puede buscar en Google más información relacionada con la señal.
depuración del archivo de volcado del núcleo
1 2 3 4 5 6 7 8 9 10 11 12 |
|
El código anterior es un código de ejemplo que generará coredump
En este momento, se genera un nuevo archivo central bajo este programa ejecutable.
Vea dónde falló el proceso
Localiza la línea del accidente
Puede activar el interruptor de depuración -g al compilar
1 |
|
Si no desea configurar el modo global de coredum, solo necesita generar un archivo principal que pueda ubicar la ubicación del bloqueo para el proceso actual. Solo se requieren 4 operaciones.
1 2 3 4 |
|
Una cosa a tener en cuenta al compilar el programa anterior, debe traer el parámetro -g, para que el programa ejecutable generado traiga suficiente información de depuración. Después de compilar y ejecutar, debería poder ver las palabras tan esperadas "Fallo de segmento (núcleo descargado)" o "Fallo de segmento (núcleo descargado)". Compruebe si hay un archivo core o core.xxx en el directorio actual. Utilice el depurador clásico GDB en Linux, primero cargue el programa con el archivo principal: gdb exefile core, aquí debe prestar atención al archivo principal que debe generar el exefile; de lo contrario, la tabla de símbolos no se cargará. Se ve así después de cargar
1 2 3 4 5 6 |
|
Podemos ver que podemos ubicar directamente el núcleo y escribir un área de memoria de solo lectura en la línea 8 que hace que se active la señal de Fallo de segmento. Hay un pequeño truco al cargar el núcleo. Si no sabe qué programa generó el archivo del núcleo de antemano, puede encontrar uno para reemplazarlo. Por ejemplo, / usr / bin / w es una buena opción. Por ejemplo, si usamos este método para cargar el núcleo generado anteriormente, gdb tendrá una salida similar
1 2 3 4 5 |
|
Puede ver que GDB ya le ha recordado qué programa generó este núcleo.
Operaciones comunes del BGF
El programa anterior es relativamente simple y el problema se puede encontrar directamente sin operaciones adicionales. Este no es el caso en la realidad. A menudo es necesario realizar un seguimiento de un solo paso, establecer puntos de interrupción y otras operaciones para localizar el problema sin problemas. Algunas operaciones comunes de GDB se enumeran a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|