Mi programa funciona así:
exe -p param1 -i param2 -o param3
Se estrelló y se genera un archivo de volcado de memoria, core.pid
.
Quiero analizar el archivo de volcado de núcleo por
gdb ./exe -p param1 -i param2 -o param3 core.pid
Pero GDB reconoce los parámetros del archivo EXE como entrada de GDB.
¿Cómo analizo un archivo de volcado de núcleo en esta situación?
exe
no es un script de shell (para establecer algunas variables, etc.) como, por ejemplo,firefox
en Linux?Respuestas:
Puede usar el núcleo con GDB de muchas maneras, pero pasar los parámetros que se pasarán al ejecutable a GDB no es la forma de usar el archivo central. Esta también podría ser la razón por la que obtuvo ese error. Puede usar el archivo principal de las siguientes maneras:
gdb <executable> <core-file>
ogdb <executable> -c <core-file>
oAl usar el archivo central no tiene que pasar argumentos. El escenario de bloqueo se muestra en GDB (verificado con GDB versión 7.1 en Ubuntu).
Por ejemplo:
Si desea pasar parámetros al ejecutable para su depuración en GDB, use
--args
.Por ejemplo:
Las páginas de manual serán útiles para ver otras opciones de GDB.
fuente
Uso simple de GDB, para depurar archivos coredump:
Un archivo coredump para un "proceso" se crea como un archivo "core.pid".
Después de ingresar al indicador GDB (en la ejecución del comando anterior), escriba:
Esto le proporcionará la información de la pila, donde puede analizar la causa del accidente / falla. Otro comando, para los mismos propósitos es:
Esto es lo mismo que arriba. Por convención, enumera toda la información de la pila (que finalmente conduce a la ubicación del bloqueo).
fuente
Simplemente omita los parámetros. GDB no los necesita:
fuente
objdump
+gdb
ejemplo ejecutable mínimoTL; DR:
objdump -s core
se puede usar para volcar memoria a granelAhora para la configuración de prueba educativa completa:
C Principal
Compila y ejecuta para generar el núcleo:
Salida:
GDB nos señala la línea exacta donde ocurrió la falla de segmentación, que es lo que la mayoría de los usuarios desean durante la depuración:
luego:
lo que nos lleva directamente a la línea buggy 7.
Los argumentos de la CLI se almacenan en el archivo principal y no es necesario volver a pasarlos
Para responder a las preguntas específicas del argumento CLI, vemos que si cambiamos los argumentos cli, por ejemplo, con:
entonces esto se refleja en el bactrace anterior sin ningún cambio en nuestros comandos:
Entonces nota cómo ahora
argc=3
. Por lo tanto, esto debe significar que el archivo central almacena esa información. Supongo que solo lo almacena como argumentos demain
, al igual que almacena los argumentos de cualquier otra función.Esto tiene sentido si considera que el volcado del núcleo debe estar almacenando toda la memoria y el estado del registro del programa, por lo que tiene toda la información necesaria para determinar el valor de los argumentos de la función en la pila actual.
Menos obvio es cómo inspeccionar las variables de entorno: cómo obtener la variable de entorno de un volcado de núcleo Las variables de entorno también están presentes en la memoria, por lo que el objdump contiene esa información, pero no estoy seguro de cómo enumerarlas todas de una vez. , uno por uno de la siguiente manera funcionó en mis pruebas:
Análisis de Binutils
Mediante el uso de herramientas binutils como
readelf
yobjdump
, podemos volcar la información contenida en elcore
archivo como el estado de la memoria.La mayor parte / todo también debe ser visible a través de GDB, pero esas herramientas binutils ofrecen un enfoque más masivo que es conveniente para ciertos casos de uso, mientras que GDB es más conveniente para una exploración más interactiva.
Primero:
nos dice que el
core
archivo es en realidad un archivo ELF :Es por eso que podemos inspeccionarlo más directamente con las herramientas habituales de binutils.
Un vistazo rápido al estándar ELF muestra que en realidad hay un tipo ELF dedicado a él:
Se puede encontrar más información sobre el formato en:
Luego:
da algunas pistas sobre la estructura del archivo. La memoria parece estar contenida en los encabezados regulares del programa:
y hay algunos metadatos más presentes en un área de notas, en particular
prstatus
contiene la PC :objdump
puede volcar fácilmente toda la memoria con:que contiene:
que coincide exactamente con el valor stdout en nuestra ejecución.
Esto se probó en Ubuntu 16.04 amd64, GCC 6.4.0 y binutils 2.26.1.
fuente
Del tutorial del depurador GDB de RMS :
Asegúrese de que su archivo es realmente una
core
imagen - Hay que utilizarfile
.fuente
Un enfoque ligeramente diferente le permitirá omitir GDB por completo. Si todo lo que quiere es una traza inversa, la utilidad específica de Linux 'catchsegv' capturará SIGSEGV y mostrará una traza inversa.
fuente
No importa si el ejecutable tiene argumentos o no. Para ejecutar GDB en cualquier binario con un archivo core generado, la sintaxis se encuentra a continuación.
Permítanme tomar el siguiente ejemplo para una mayor comprensión.
De la salida anterior, puede adivinar algo sobre el núcleo, ya sea un acceso NULL, SIGABORT, etc.
Estos números del 0 al 10 son los marcos de pila de GDB. Estos marcos de pila no son de su binario. En los cuadros 0-10 anteriores, si sospecha que algo está mal, seleccione ese cuadro
Ahora para ver más detalles al respecto:
Para seguir investigando el problema, puede imprimir los valores variables sospechosos aquí en este momento.
fuente
Simplemente escriba el comando:
O
No es necesario proporcionar ningún argumento de línea de comando. El volcado de código generado debido a un ejercicio anterior.
fuente
Puede analizar el archivo de volcado de núcleo utilizando el comando "gdb".
fuente