Core dump hanyalah dump dari jejak memori program Anda, jika Anda tahu di mana semuanya berada maka Anda bisa menggunakannya.
Anda menggunakan executable karena itu menjelaskan di mana (dalam hal alamat logis) hal-hal berada di memori, yaitu file inti.
Jika Anda menggunakan perintah, objdump
itu akan membuang data meta tentang objek yang dapat dieksekusi yang Anda selidiki. Menggunakan objek yang dapat dieksekusi bernama a.out sebagai contoh.
objdump -h a.out
hanya membuang informasi tajuk, Anda akan melihat bagian bernama mis. DATA atau .bss atau .text (masih banyak lagi). Ini menginformasikan kernel loader di mana dalam objek berbagai bagian dapat ditemukan dan di mana dalam ruang alamat proses bagian harus dimuat, dan untuk beberapa bagian (misalnya. Data .text) apa yang harus dimuat. (Bagian .bss tidak mengandung data apa pun dalam file tetapi mengacu pada jumlah memori yang akan disimpan dalam proses untuk data yang tidak diinisialisasi, itu diisi dengan nol).
Tata letak file objek yang dapat dieksekusi sesuai dengan standar, ELF.
objdump -x a.out
- kesedihan segalanya
Jika objek yang dapat dieksekusi masih berisi tabel simbolnya (belum dilucuti - man strip
dan Anda digunakan -g
untuk menghasilkan generasi debug dengan gcc
asumsi kompilasi sumber ac), maka Anda dapat memeriksa konten inti dengan nama simbol, misalnya jika Anda memiliki variabel / buffer bernama inputLine di kode sumber Anda, Anda bisa menggunakan nama itu gdb
untuk melihat kontennya. yaitu gdb
akan mengetahui offset dari awal program Anda menginisialisasi segmen data di mana inputLine dimulai dan panjang variabel itu.
Bacaan lebih lanjut Article1 ,
Pasal 2 , dan untuk spesifikasi Executable and Linking Format (ELF) yang sangat diperlukan .
Perbarui setelah komentar @mirabilos di bawah ini.
Tetapi jika menggunakan tabel simbol seperti pada
$ gdb --batch -s a.out -c core -q -ex "x buf1"
Menghasilkan
0x601060 <buf1>: 0x72617453
dan kemudian tidak menggunakan tabel simbol dan memeriksa alamat langsung di,
$ gdb --batch -c core -q -ex "x 0x601060"
Menghasilkan
0x601060: 0x72617453
Saya telah memeriksa memori secara langsung tanpa menggunakan tabel simbol pada perintah ke-2.
Saya juga melihat, jawaban @ user580082 menambah penjelasan lebih lanjut, dan akan dimutakhirkan.