text addr: 0x4007d4
data addr: 0x7ffec6739220
mmap addr: 0x1612010
Segmentation fault (core dumped)
GDB mengarahkan kami ke baris yang tepat di mana segfault terjadi, yang diinginkan sebagian besar pengguna saat melakukan debug:
gdb -q -nh main.out core
kemudian:
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
yang mengarahkan kita langsung ke jalur kereta 7.
Analisis binutils
Pertama:
file core
memberi tahu kami bahwa corefile tersebut sebenarnya adalah file ELF:
core: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from './main.out'
itulah sebabnya kami dapat memeriksanya lebih langsung dengan alat binutils biasa.
Pandangan cepat pada standar ELF menunjukkan bahwa sebenarnya ada tipe ELF yang didedikasikan untuknya:
Elf32_Ehd.e_type == ET_CORE
Informasi format lebih lanjut dapat ditemukan di:
man 5 core
Kemudian:
readelf -Wa core
memberikan beberapa petunjuk tentang struktur file. Memori tampaknya terkandung dalam tajuk program reguler:
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
dan ada beberapa metadata hadir di area catatan. Khususnya, saya kira PC harus ada di sana (TODO konfirmasi):
gdb adalah debugger GNU yang dapat digunakan untuk memeriksa file inti. BTW bt(backtrace) adalah perintah gdb yang berguna untuk memeriksa tumpukan panggilan program.
Jawaban:
objdump
+gdb
contoh runnable minimalTLDR:
objdump -s core
untuk membuang memoriGDB untuk menemukan garis gagal, yang sebelumnya disebutkan di: Bagaimana cara melihat file inti untuk keperluan debugging di Linux?
Sekarang untuk pengaturan tes pendidikan lengkap:
main.c
Kompilasi, dan jalankan untuk menghasilkan inti:
Keluaran:
GDB mengarahkan kami ke baris yang tepat di mana segfault terjadi, yang diinginkan sebagian besar pengguna saat melakukan debug:
kemudian:
yang mengarahkan kita langsung ke jalur kereta 7.
Analisis binutils
Pertama:
memberi tahu kami bahwa
core
file tersebut sebenarnya adalah file ELF:itulah sebabnya kami dapat memeriksanya lebih langsung dengan alat binutils biasa.
Pandangan cepat pada standar ELF menunjukkan bahwa sebenarnya ada tipe ELF yang didedikasikan untuknya:
Informasi format lebih lanjut dapat ditemukan di:
Kemudian:
memberikan beberapa petunjuk tentang struktur file. Memori tampaknya terkandung dalam tajuk program reguler:
dan ada beberapa metadata hadir di area catatan. Khususnya, saya kira PC harus ada di sana (TODO konfirmasi):
objdump
dapat dengan mudah membuang semua memori dengan:yang mengandung:
yang cocok persis dengan nilai stdout dalam menjalankan kami.
Diuji di Ubuntu 16.04 amd64, GCC 6.4.0, binutils 2.26.1.
sumber
gdb adalah debugger GNU yang dapat digunakan untuk memeriksa file inti. BTW
bt
(backtrace) adalah perintah gdb yang berguna untuk memeriksa tumpukan panggilan program.sumber
Saat Anda mengkompilasi program gunakan opsi -g
gcc -g program.c
Jika file inti dibuat maka Anda dapat men-debug menggunakan gdb tanpa menggunakan opsi -g bendera debug tidak akan diaktifkan.
sumber
Jika lebih suka menggunakan alat baris perintah, maka Anda dapat menggunakan gdb :
atau
Jika Anda suka gui, maka instal ddd , dan dari sana buka program untuk debug dan file inti.
sumber
sumber