text addr: 0x4007d4
data addr: 0x7ffec6739220
mmap addr: 0x1612010
Segmentation fault (core dumped)
O GDB nos indica a linha exata em que o segfault aconteceu, que é o que a maioria dos usuários deseja durante a depuração:
gdb -q -nh main.out core
então:
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
o que nos aponta diretamente para a linha de buggy 7.
Análise de Binutils
Primeiro:
file core
nos diz que o corearquivo é realmente um arquivo ELF:
core: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from './main.out'
é por isso que somos capazes de inspecioná-lo mais diretamente com as ferramentas binutils comuns.
Uma rápida olhada no padrão ELF mostra que existe realmente um tipo ELF dedicado a ele:
Elf32_Ehd.e_type == ET_CORE
Informações adicionais sobre o formato podem ser encontradas em:
man 5 core
Então:
readelf -Wa core
fornece algumas dicas sobre a estrutura do arquivo. A memória parece estar contida nos cabeçalhos regulares do 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
e há mais alguns metadados presentes em uma área de anotações. Notavelmente, acho que o PC deve estar lá (confirmação do TODO):
O gdb é o depurador GNU que pode ser usado para examinar o arquivo principal. BTW bt(backtrace) é um comando gdb útil para examinar a pilha de chamadas do programa.
Respostas:
objdump
+gdb
exemplo mínimo executávelTLDR:
objdump -s core
despejar memóriaGDB para encontrar linha com falha, mencionado anteriormente em: Como exibir arquivos principais para fins de depuração no Linux?
Agora, para uma configuração completa do teste educacional:
main.c
Compile e execute para gerar o núcleo:
Saída:
O GDB nos indica a linha exata em que o segfault aconteceu, que é o que a maioria dos usuários deseja durante a depuração:
então:
o que nos aponta diretamente para a linha de buggy 7.
Análise de Binutils
Primeiro:
nos diz que o
core
arquivo é realmente um arquivo ELF:é por isso que somos capazes de inspecioná-lo mais diretamente com as ferramentas binutils comuns.
Uma rápida olhada no padrão ELF mostra que existe realmente um tipo ELF dedicado a ele:
Informações adicionais sobre o formato podem ser encontradas em:
Então:
fornece algumas dicas sobre a estrutura do arquivo. A memória parece estar contida nos cabeçalhos regulares do programa:
e há mais alguns metadados presentes em uma área de anotações. Notavelmente, acho que o PC deve estar lá (confirmação do TODO):
objdump
pode facilmente despejar toda a memória com:que contém:
que corresponde exatamente ao valor stdout em nossa execução.
Testado no Ubuntu 16.04 amd64, GCC 6.4.0, binutils 2.26.1.
fonte
O gdb é o depurador GNU que pode ser usado para examinar o arquivo principal. BTW
bt
(backtrace) é um comando gdb útil para examinar a pilha de chamadas do programa.fonte
Ao compilar o programa, use a opção -g
gcc -g program.c
Se o arquivo principal for criado, você poderá depurar usando o gdb sem usar a opção -g, os sinalizadores de depuração não serão ativados.
fonte
Se preferir usar a ferramenta de linha de comando, você poderá usar o gdb :
ou
Se você gosta de gui, instale o ddd e, a partir daí, abra o programa para depurar e o arquivo principal.
fonte
fonte