text addr: 0x4007d4
data addr: 0x7ffec6739220
mmap addr: 0x1612010
Segmentation fault (core dumped)
GDB wskazuje nam dokładną linię, w której nastąpił segfault, a tego właśnie chce większość użytkowników podczas debugowania:
gdb -q -nh main.out core
następnie:
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
co wskazuje nam bezpośrednio na wadliwą linię 7.
Analiza Binutils
Pierwszy:
file core
mówi nam, że coreplik jest w rzeczywistości plikiem ELF:
core: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from './main.out'
dlatego jesteśmy w stanie to sprawdzić bardziej bezpośrednio za pomocą zwykłych narzędzi binutils.
Szybkie spojrzenie na standard ELF pokazuje, że faktycznie jest do niego dedykowany typ ELF:
Elf32_Ehd.e_type == ET_CORE
Więcej informacji o formacie można znaleźć na stronie:
man 5 core
Następnie:
readelf -Wa core
daje kilka wskazówek na temat struktury pliku. Wygląda na to, że pamięć jest zawarta w zwykłych nagłówkach programu:
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
a w obszarze notatek znajduje się więcej metadanych. W szczególności myślę, że komputer musi tam być (TODO potwierdź):
Odpowiedzi:
objdump
+gdb
minimalny możliwy do uruchomienia przykładTLDR:
objdump -s core
zrzucić pamięćGDB w celu znalezienia linii awarii, o której wcześniej wspomniano w: Jak wyświetlić podstawowe pliki do celów debugowania w systemie Linux?
Teraz pełna konfiguracja testu edukacyjnego:
main.c
Skompiluj i uruchom, aby wygenerować rdzeń:
Wydajność:
GDB wskazuje nam dokładną linię, w której nastąpił segfault, a tego właśnie chce większość użytkowników podczas debugowania:
następnie:
co wskazuje nam bezpośrednio na wadliwą linię 7.
Analiza Binutils
Pierwszy:
mówi nam, że
core
plik jest w rzeczywistości plikiem ELF:dlatego jesteśmy w stanie to sprawdzić bardziej bezpośrednio za pomocą zwykłych narzędzi binutils.
Szybkie spojrzenie na standard ELF pokazuje, że faktycznie jest do niego dedykowany typ ELF:
Więcej informacji o formacie można znaleźć na stronie:
Następnie:
daje kilka wskazówek na temat struktury pliku. Wygląda na to, że pamięć jest zawarta w zwykłych nagłówkach programu:
a w obszarze notatek znajduje się więcej metadanych. W szczególności myślę, że komputer musi tam być (TODO potwierdź):
objdump
może łatwo zrzucić całą pamięć za pomocą:który zawiera:
co odpowiada dokładnie wartości standardowej w naszym biegu.
Testowane w Ubuntu 16.04 amd64, GCC 6.4.0, binutils 2.26.1.
źródło
gdb to debuger GNU, którego można użyć do zbadania pliku podstawowego. BTW
bt
(backtrace) to przydatna komenda gdb do badania stosu wywołań programu.źródło
Podczas kompilacji programu użyj opcji -g
gcc -g program.c
Jeśli plik podstawowy jest tworzony, możesz debugować za pomocą gdb bez użycia opcji -g flagi debugowania nie będą włączone.
źródło
Jeśli wolisz korzystać z narzędzia wiersza poleceń, możesz użyć gdb :
lub
Jeśli podoba Ci się GUI, zainstaluj ddd , a stamtąd otwórz program do debugowania i plik podstawowy.
źródło
źródło