El programa ROS falla en Linux, el proceso ha muerto [pid 20083, código de salida -11, depuración del volcado de núcleo cmd /home GDB

       En Linux, la información de la pila cuando el programa se cierra de forma anormal (como señales de excepción SIGSEGV, SIGABRT, etc.) se puede obtener a través del archivo principal. El volcado de núcleo se llama volcado de núcleo . Es una instantánea de la memoria en el momento en que ocurre una excepción durante la ejecución del programa. Cuando ocurre una excepción en el programa y la excepción no se captura dentro del proceso, el sistema operativo almacenará el La memoria, el estado del registro y los volcados de información, como las pilas en ejecución, se guardan en un archivo central, llamado volcado de núcleo. El archivo principal es un archivo generado por el volcado del núcleo después de la ejecución ilegal del programa. Este archivo es un archivo binario y se puede abrir y analizar usando gdb, elfdump y objdump para analizar el contenido específico.

Posibles razones para el volcado de memoria : (1) Acceso a la memoria fuera de los límites;

                                               (2) Los programas multiproceso utilizan funciones inseguras para subprocesos;

                                               (3) Los datos leídos y escritos por subprocesos múltiples no están protegidos por bloqueos;

                                               (4) Puntero ilegal;

                                               (5) Desbordamiento de pila.

Pasos de depuración:

1. Compruebe si el volcado de núcleo está abierto. Si devuelve 0, significa que no está abierto. Si devuelve ilimitado, significa que está abierto.

ulimit -c

2. Si el volcado de memoria no está activado

ulimit -c unlimited

Después de ejecutar este comando, solo es válido para la terminal actual.

Si desea que sea válido para todos los terminales, agregue esta línea de código al final de .bashrc, de la siguiente manera

3. Para generar un archivo ejecutable, agregue la opción -g para obtener la información del número de línea específica; de lo contrario, no habrá

g++ -g -o main main.c

4. Después de ejecutar el programa, se genera un archivo principal, que de forma predeterminada se coloca en el mismo directorio que el archivo ejecutable y el nombre del archivo se fija en núcleo.

./main

Ejecute el siguiente comando para cambiar el nombre del archivo a un formato como core.pid, donde pid es el número de proceso que ejecuta el programa actual y el contenido original en core_uses_pid es 0: 

eco "1" > /proc/sys/kernel/core_uses_pid

Cita 1 , Cita 2

5. Utilice gdb para depurar el núcleo

gdb main core

6. Ver información de la pila de programas

bt

pequeña prueba:

#include "stdio.h"
 
int main(){
	int *b = 0;
	*b = 10;
	printf("******** b = %d ************ ",*b);
}

Se genera el archivo principal

El error del programa se muestra en la línea 5. 

referencia

Métodos para generar archivos de fallos para su análisis en ros: 

1. Compruebe si el volcado de memoria está activado

2. Luego ejecute el nodo directamente con roslaun o rosun y luego genere un archivo de falla. La ubicación donde se genera el archivo de volcado de núcleo durante el lanzamiento de ros está en $ROS_HOME. Si no está configurado, el valor predeterminado es el directorio ~/.ros.

        Nota: Al compilar y generar bibliotecas o archivos ejecutables, debe activar la opción de depuración; de lo contrario, no habrá información de depuración de gdb y no podrá ver el código fuente ni establecer puntos de interrupción .

        Compilación directa de un solo archivo: simplemente agregue la opción -g
g++ -g -o main main.c
        Compilación del proyecto: 

                Modo de línea de comando:

catkin_make -DCMAKE_BUILD_TYPE=Debug

                Modifique el archivo CMakelist.txt:

SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

3. Vea el archivo de volcado de núcleo con gdb (-q: indica un descargo de responsabilidad que bloquea la impresión de GDB)

gdb main core -q

 referencia

Supongo que te gusta

Origin blog.csdn.net/qq_34761779/article/details/131578480
Recomendado
Clasificación