Apa yang terjadi jika file inti dihasilkan dari distro Linux selain dari yang kita jalankan di Dev? Apakah jejak tumpukan bahkan bermakna?
Jika executable terhubung secara dinamis, seperti milik Anda, tumpukan yang dihasilkan GDB akan (kemungkinan besar) tidak menjadi bermakna.
Alasannya:GDB mengetahui bahwa executable Anda mogok dengan memanggil sesuatu di libc.so.6
di alamat 0x00454ff1
, tetapi tidak tahu kode apa yang ada di alamat itu. Jadi itu melihat Anda salinan libc.so.6
dan menemukan bahwa ini ada di select
, sehingga mencetak itu.
Tapi kemungkinannya 0x00454ff1
juga di pilih di pelanggan Anda salinan libc.so.6
cukup kecil. Kemungkinan besar pelanggan memiliki beberapa prosedur lain di alamat tersebut, mungkin abort
.
Anda dapat menggunakan disas select
, dan amati 0x00454ff1
itu berada di tengah instruksi, atau instruksi sebelumnya bukan CALL
. Jika salah satu dari penangguhan ini, pelacakan tumpukan Anda tidak ada artinya.
Anda bisa namun bantulah diri Anda sendiri:Anda hanya perlu mendapatkan salinan dari semua perpustakaan yang tercantum dalam (gdb) info shared
dari sistem pelanggan. Suruh pelanggan memasangnya dengan mis.
cd /
tar cvzf to-you.tar.gz lib/libc.so.6 lib/ld-linux.so.2 ...
Kemudian, di sistem Anda:
mkdir /tmp/from-customer
tar xzf to-you.tar.gz -C /tmp/from-customer
gdb /path/to/binary
(gdb) set solib-absolute-prefix /tmp/from-customer
(gdb) core core # Note: very important to set solib-... before loading core
(gdb) where # Get meaningful stack trace!
Kami kemudian menyarankan Pelanggan untuk menjalankan biner -g sehingga lebih mudah untuk melakukan debug.
A banyak pendekatan yang lebih baik adalah:
- bangun dengan
-g -O2 -o myexe.dbg
strip -g myexe.dbg -o myexe
- distribusikan
myexe
kepada pelanggan - saat pelanggan mendapatkan
core
, gunakanmyexe.dbg
untuk men-debugnya
Anda akan mendapatkan info simbolis lengkap (file/baris, variabel lokal), tanpa harus mengirimkan biner khusus kepada pelanggan, dan tanpa mengungkapkan terlalu banyak detail tentang sumber Anda.
Anda memang bisa mendapatkan informasi yang berguna dari crash dump, bahkan dari kompilasi yang dioptimalkan (walaupun itu yang disebut, secara teknis, "sangat merepotkan.") -g
kompilasi memang lebih baik, dan ya, Anda dapat melakukannya bahkan ketika mesin tempat dump terjadi adalah distribusi lain. Pada dasarnya, dengan satu peringatan, semua informasi penting terkandung dalam file yang dapat dieksekusi dan berakhir di dump.
Saat Anda mencocokkan file inti dengan yang dapat dieksekusi, debugger akan dapat memberi tahu Anda di mana crash terjadi dan menunjukkan tumpukannya. Itu sendiri seharusnya banyak membantu. Anda juga harus mencari tahu sebanyak mungkin tentang situasi di mana hal itu terjadi -- dapatkah mereka memperbanyaknya dengan andal? Jika demikian, dapatkah Anda memperbanyaknya?
Sekarang, inilah peringatannya:tempat di mana gagasan "semuanya ada" rusak adalah dengan file objek bersama, .so
file. Jika gagal karena ada masalah dengan itu, Anda tidak akan memiliki tabel simbol yang Anda butuhkan; Anda mungkin hanya dapat melihat perpustakaan apa .so
itu terjadi di.
Ada sejumlah buku tentang proses debug, tetapi saya tidak dapat memikirkan satu pun yang akan saya rekomendasikan.