GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo analizo el archivo de volcado del núcleo de un programa con GDB cuando tiene parámetros de línea de comandos?

Puede usar el núcleo con GDB de muchas maneras, pero pasar parámetros que se pasarán al ejecutable a GDB no es la forma de usar el archivo del núcleo. Esta también podría ser la razón por la que recibió ese error. Puede usar el archivo central de las siguientes maneras:

gdb <executable> <core-file> o gdb <executable> -c <core-file> o

gdb <executable>
...
(gdb) core <core-file>

Cuando usa el archivo central, no tiene que pasar argumentos. El escenario de bloqueo se muestra en GDB (comprobado con GDB versión 7.1 en Ubuntu).

Por ejemplo:

$ ./crash -p param1 -o param2
Segmentation fault (core dumped)
$ gdb ./crash core
GNU gdb (GDB) 7.1-ubuntu
...
Core was generated by `./crash -p param1 -o param2'. <<<<< See this line shows crash scenario
Program terminated with signal 11, Segmentation fault.
#0  __strlen_ia32 () at ../sysdeps/i386/i686/multiarch/../../i586/strlen.S:99
99    ../sysdeps/i386/i686/multiarch/../../i586/strlen.S: No such file or directory.
    in ../sysdeps/i386/i686/multiarch/../../i586/strlen.S
(gdb)

Si quiere pasar parámetros al ejecutable para ser depurado en GDB, use --args .

Por ejemplo:

$ gdb --args ./crash -p param1 -o param2
GNU gdb (GDB) 7.1-ubuntu
...
(gdb) r
Starting program: /home/@@@@/crash -p param1 -o param2

Program received signal SIGSEGV, Segmentation fault.
__strlen_ia32 () at ../sysdeps/i386/i686/multiarch/../../i586/strlen.S:99
99    ../sysdeps/i386/i686/multiarch/../../i586/strlen.S: No such file or directory.
    in ../sysdeps/i386/i686/multiarch/../../i586/strlen.S
(gdb)

Las páginas man serán útiles para ver otras opciones de GDB.


Uso simple de GDB, para depurar archivos de volcado de memoria:

gdb <executable_path> <coredump_file_path>

Un archivo de volcado de núcleo para un "proceso" se crea como un archivo "core.pid".

Después de ingresar al indicador de GDB (al ejecutar el comando anterior), escriba:

...
(gdb) where

Esto lo llevará con la información de la pila, donde puede analizar la causa del bloqueo/fallo. Otro comando, para los mismos fines es:

...
(gdb) bt full

Esto es lo mismo que arriba. Por convención, enumera toda la información de la pila (que en última instancia conduce a la ubicación del bloqueo).


Simplemente omita los parámetros. GDB no los necesita:

gdb ./exe core.pid

Linux
  1. ¿Cómo redirigir la salida de un programa a un archivo zip?

  2. ¿Ejecutar un programa con varios parámetros (bucle)?

  3. ¿Cómo analizar un segmento de un archivo de audio con Sox?

  4. Cómo depurar el programa C usando gdb en 6 pasos simples

  5. ¿Cuándo se elimina un archivo creado con mkstemp()?

Cómo usar el comando rm de Linux con ejemplos

Cómo corregir el error de conversión con Calibre

Cómo recargar .bash_profile en la línea de comandos de Linux

Cómo abordar los nombres de archivo con espacios en Linux

Cómo ver el archivo Core (general)

¿Cómo eliminar archivos .fuse_hidden*?