Program saya beroperasi seperti ini:
exe -p param1 -i param2 -o param3
Itu crash dan menghasilkan file dump inti core.pid
,.
Saya ingin menganalisis file dump inti
gdb ./exe -p param1 -i param2 -o param3 core.pid
Tetapi GDB mengenali parameter dari file EXE sebagai input GDB.
Bagaimana cara menganalisis file dump inti dalam situasi ini?
exe
bukan skrip shell (untuk mengatur beberapa variabel, dll.) Seperti misalnyafirefox
di Linux?Jawaban:
Anda dapat menggunakan inti dengan GDB dalam banyak cara, tetapi melewati parameter yang akan diteruskan ke dieksekusi ke GDB bukan cara untuk menggunakan file inti. Ini juga bisa menjadi alasan Anda mendapatkan kesalahan itu. Anda dapat menggunakan file inti dengan cara berikut:
gdb <executable> <core-file>
ataugdb <executable> -c <core-file>
atauSaat menggunakan file inti Anda tidak harus memberikan argumen. Skenario kerusakan ditampilkan di GDB (diperiksa dengan GDB versi 7.1 di Ubuntu).
Sebagai contoh:
Jika Anda ingin meneruskan parameter ke executable untuk didebug di GDB, gunakan
--args
.Sebagai contoh:
Halaman manual akan sangat membantu untuk melihat opsi GDB lainnya.
sumber
Penggunaan sederhana GDB, untuk men-debug file coredump:
File coredump untuk "proses" akan dibuat sebagai file "core.pid".
Setelah Anda masuk ke dalam prompt GDB (pada pelaksanaan perintah di atas), ketik:
Ini akan memberi Anda informasi, tentang tumpukan, di mana Anda dapat menganalisis penyebab crash / kesalahan. Perintah lain, untuk tujuan yang sama adalah:
Ini sama dengan di atas. Dengan konvensi, ini mencantumkan seluruh informasi tumpukan (yang akhirnya mengarah ke lokasi macet).
sumber
Lewati saja parameternya. GDB tidak membutuhkannya:
sumber
objdump
+gdb
contoh runnable minimalTL; DR:
objdump -s core
dapat digunakan untuk membuang memori secara massalSekarang untuk pengaturan tes pendidikan penuh:
main.c
Kompilasi, dan jalankan untuk menghasilkan inti:
Keluaran:
GDB mengarahkan kami ke baris yang tepat di mana kesalahan segmentasi terjadi, yang merupakan hal yang diinginkan sebagian besar pengguna saat melakukan debug:
kemudian:
yang mengarahkan kita langsung ke buggy line 7.
Argumen CLI disimpan dalam file inti dan tidak perlu diteruskan lagi
Untuk menjawab pertanyaan argumen CLI tertentu, kita melihat bahwa jika kita mengubah argumen cli misalnya dengan:
maka ini tercermin dalam bactrace sebelumnya tanpa perubahan pada perintah kami:
Jadi perhatikan bagaimana sekarang
argc=3
. Karena itu, ini harus berarti bahwa file inti menyimpan informasi itu. Saya kira itu hanya menyimpannya sebagai argumenmain
, sama seperti menyimpan argumen dari fungsi lain.Ini masuk akal jika Anda mempertimbangkan bahwa dump inti harus menyimpan seluruh memori dan mendaftar keadaan program, dan karena itu memiliki semua informasi yang diperlukan untuk menentukan nilai argumen fungsi pada tumpukan saat ini.
Yang kurang jelas adalah bagaimana memeriksa variabel lingkungan: Cara mendapatkan variabel lingkungan dari dump inti. Variabel lingkungan juga ada dalam memori sehingga objdump memang berisi informasi itu, tapi saya tidak yakin bagaimana mendaftar semuanya dalam sekali jalan dengan mudah , satu per satu sebagai berikut berhasil pada tes saya:
Analisis binutils
Dengan menggunakan alat-alat binutils seperti
readelf
danobjdump
, kita dapat membuang informasi yang terkandung dalam filecore
file seperti keadaan memori.Kebanyakan / semua itu juga harus terlihat melalui GDB, tetapi alat-alat binutils menawarkan pendekatan yang lebih massal yang nyaman untuk kasus penggunaan tertentu, sementara GDB lebih nyaman untuk eksplorasi yang lebih interaktif.
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 yang ada di area catatan, terutama
prstatus
berisi PC :objdump
dapat dengan mudah membuang semua memori dengan:yang mengandung:
yang cocok persis dengan nilai stdout dalam menjalankan kami.
Ini diuji pada Ubuntu 16.04 amd64, GCC 6.4.0, dan binutils 2.26.1.
sumber
Dari tutorial debugger GDB RMS :
Pastikan file Anda benar-benar
core
gambar - periksa menggunakanfile
.sumber
Pendekatan yang sedikit berbeda akan memungkinkan Anda untuk melewati GDB sepenuhnya. Jika yang Anda inginkan adalah backtrace, utilitas khusus Linux 'catchsegv' akan menangkap SIGSEGV dan menampilkan backtrace.
sumber
Tidak masalah jika executable memiliki argumen atau tidak. Untuk menjalankan GDB pada sembarang biner dengan file inti yang dihasilkan, sintaksinya ada di bawah.
Biarkan saya mengambil contoh di bawah ini untuk lebih memahami.
Dari output di atas, Anda dapat menebak sesuatu tentang inti, apakah itu akses NULL, SIGABORT, dll.
Angka-angka ini # 0 hingga # 10 adalah susunan bingkai GDB. Frame tumpukan ini bukan dari biner Anda. Dalam 0 - 10 bingkai di atas jika Anda mencurigai ada yang salah pilih bingkai itu
Sekarang untuk melihat detail lebih lanjut tentang itu:
Untuk menyelidiki masalah lebih lanjut, Anda dapat mencetak nilai-nilai variabel yang dicurigai di sini pada saat ini.
sumber
Cukup ketik perintah:
Atau
Tidak perlu memberikan argumen baris perintah. Dump kode yang dihasilkan karena latihan sebelumnya.
sumber
Anda dapat menganalisis file dump inti menggunakan perintah "gdb".
sumber