text addr: 0x4007d4
data addr: 0x7ffec6739220
mmap addr: 0x1612010
Segmentation fault (core dumped)
GDB nos señala la línea exacta donde ocurrió la falla predeterminada, que es lo que la mayoría de los usuarios desean durante la depuración:
gdb -q -nh main.out core
luego:
Reading symbols from main.out...done.
[New LWP 27479]
Core was generated by `./main.out'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x0000000000400635 in myfunc (i=1) at main.c:7
7 *(int*)(NULL) = i;
(gdb) bt
#0 0x0000000000400635 in myfunc (i=1) at main.c:7
#1 0x000000000040072b in main (argc=1, argv=0x7ffec6739328) at main.c:28
lo que nos lleva directamente a la línea buggy 7.
Análisis de Binutils
Primero:
file core
nos dice que el corearchivo es en realidad un archivo ELF:
core: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from './main.out'
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:
Elf32_Ehd.e_type == ET_CORE
Se puede encontrar más información sobre el formato en:
man 5 core
Luego:
readelf -Wa core
da algunas pistas sobre la estructura del archivo. La memoria parece estar contenida en los encabezados regulares del programa:
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
NOTE 0x000468 0x0000000000000000 0x0000000000000000 0x000b9c 0x000000 0
LOAD 0x002000 0x0000000000400000 0x0000000000000000 0x001000 0x001000 R E 0x1000
LOAD 0x003000 0x0000000000600000 0x0000000000000000 0x001000 0x001000 R 0x1000
LOAD 0x004000 0x0000000000601000 0x0000000000000000 0x001000 0x001000 RW 0x1000
y hay algunos metadatos más presentes en un área de notas. En particular, supongo que la PC debe estar allí (TODO confirme):
gdb es el depurador de GNU que se puede usar para examinar el archivo central. BTW bt(backtrace) es un comando gdb útil para examinar la pila de llamadas del programa.
Respuestas:
objdump
+gdb
ejemplo ejecutable mínimoTLDR:
objdump -s core
volcar memoriaGDB para encontrar una línea defectuosa, mencionada anteriormente en: ¿Cómo ver los archivos principales con fines de depuración en Linux?
Ahora para una 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 predeterminada, 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.
Análisis de Binutils
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, supongo que la PC debe estar allí (TODO confirme):
objdump
puede volcar fácilmente toda la memoria con:que contiene:
que coincide exactamente con el valor stdout en nuestra ejecución.
Probado en Ubuntu 16.04 amd64, GCC 6.4.0, binutils 2.26.1.
fuente
gdb es el depurador de GNU que se puede usar para examinar el archivo central. BTW
bt
(backtrace) es un comando gdb útil para examinar la pila de llamadas del programa.fuente
Cuando compiles el programa usa la opción -g
gcc -g program.c
Si se crea el archivo central, puede depurar usando gdb sin usar la opción -g. Las banderas de depuración no estarán habilitadas.
fuente
Si prefiere usar la herramienta de línea de comandos, puede usar gdb :
o
Si le gusta la interfaz gráfica de usuario, instale ddd , y desde allí abra el programa para depurar y el archivo central.
fuente
fuente