El método y la configuración de Linux para generar un volcado de núcleo

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

core dump 定义

A core dump is the recorded state of the working memory of a computer program at a specific time, generally when the

program has terminated abnormally (crashed). In practice, other key pieces of program state are usually dumped at

the same time, including the processor registers, which may include the program counter and stack pointer, memory

management information, and other processor and operating system flags and information. The name comes from the

once-standard memory technology core memory. Core dumps are often used to diagnose or debug errors in computer programs.

 

On many operating systems, a fatal error in a program automatically triggers a core dump, and by extension the phrase

"to dump core" has come to mean, in many cases, any fatal error, regardless of whether a record of the program memory

is created.

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

ulimit -c 0              #不产生core文件

ulimit -c 100            #设置core文件最大为100k

ulimit -c unlimited      #不限制core文件大小   

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

vim /etc/profile                                   #然后进入编辑模式,在profile文件中加入

ulimit -c unlimited

 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:

Copiar codigo

% 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

Copiar codigo

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

进程是设置- 用户-ID ,而且当前用户并非程序文件的所有者;

进程是设置- 组-ID ,而且当前用户并非该程序文件的组所有者;

用户没有写当前工作目录的许可权;

文件太大。core 文件的许可权( 假定该文件在此之前并不存在) 通常是用户读/ 写,组读和其他读。

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

3)SIGQUIT   4)SIGILL    6)SIGABRT   8)SIGFPE    11)SIGSEGV    7)SIGBUS    31)SIGSYS

5)SIGTRAP   24)SIGXCPU  25)SIGXFSZ  29)SIGIOT

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

#include <stdio.h>

  

int func(int *p)

{

        *p = 0;

}

  

int main()

{

        func(NULL);

        return 0;

}

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

gcc main.c -g -o a.c

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

ulimit -c unlimited

echo "/tmp/core-%e-%p" > /proc/sys/kernel/core_pattern

gcc -o main -g a.c

gdb main /tmp/core-main-10815

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

sagi@sagi-laptop:~$ gdb coredump core

Core was generated by ./coredump'.

    Program terminated with signal 11, Segmentation fault.

#0  0x080483a7 in crash () at coredump.c:8

    8       xxx[1] = 'D';

(gdb)

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

sagi@sagi-laptop:~$ gdb /usr/bin/w core

Core was generated by ./coredump'.

    Program terminated with signal 11, Segmentation fault.

#0  0x080483a7 in ?? ()

    (gdb)

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

启动程序:run

设置断点:b 行号|函数名

删除断点:delete 断点编号

禁用断点:disable 断点编号

启用断点:enable 断点编号

单步跟踪:next 也可以简写 n

单步跟踪:step 也可以简写 s

打印变量:print 变量名字

设置变量:set var=value

查看变量类型:ptype var

顺序执行到结束:cont

顺序执行到某一行: util lineno

打印堆栈信息:bt

 

 

Supongo que te gusta

Origin blog.csdn.net/xqhrs232/article/details/113557757
Recomendado
Clasificación