Saya memiliki aplikasi baris perintah yang ketika dijalankan tidak melakukan apa yang seharusnya dilakukan dan pada titik tertentu meninggalkan pesan:
Segmentation fault
Apa artinya ini? Apa yang harus saya lakukan?
Saya memiliki aplikasi baris perintah yang ketika dijalankan tidak melakukan apa yang seharusnya dilakukan dan pada titik tertentu meninggalkan pesan:
Segmentation fault
Apa artinya ini? Apa yang harus saya lakukan?
Jawaban:
Kesalahan segmentasi adalah hasil dari pelanggaran akses memori. Program telah merujuk ke alamat memori di luar apa yang dialokasikan untuk itu, dan kernel OS merespons dengan membunuh program dengan SIGSEGV.
Ini adalah kesalahan, karena tidak ada gunanya mencoba mengakses memori yang tidak dapat diakses (tidak dapat dilakukan). Kesalahan semacam ini mudah dilakukan, terutama dalam bahasa seperti C dan C ++ (yang merupakan penyebab banyak aplikasi umum). Ini menunjukkan bug di dalam program itu sendiri atau di perpustakaan yang terhubung dengannya. Jika Anda ingin melaporkan bug (lakukan - ini membantu), adalah ide yang bagus untuk menyertakan jejak balik peristiwa yang mengarah ke kesalahan seg.
Untuk melakukan ini, Anda dapat menjalankan program di dalam gdb
(debugger GNU), yang seharusnya tersedia dari distro linux mana pun jika belum diinstal (paket hanya akan disebut "gdb"). Jika aplikasi yang rusak disebut "brokenapp":
gdb brokenapp
Paragraf tentang hak cipta dan lisensi akan muncul, dan pada akhirnya muncul prompt dengan kursor:
(gdb) _
Ketik run
dan tekan enter. Jika Anda perlu memberikan argumen (misalnya -x --foo=bar whatever
), tambahkan ( run -x --foo=bar whatever
). Program akan melakukan apa yang dilakukannya, Anda akan melihat hasilnya dan jika Anda perlu berinteraksi Anda dapat (perhatikan bahwa Anda dapat menjalankan segala jenis program, termasuk yang GUI, di dalam gdb). Pada titik di mana biasanya segfault, Anda akan melihat:
Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _
Baris kedua dari output di sini hanyalah sebuah contoh. Sekarang ketik bt
(untuk "backtrace") dan tekan enter. Anda akan melihat sesuatu seperti ini, meskipun mungkin lebih lama:
(gdb) bt
#0 0x00000000006031c9 in ?? ()
#1 0x000000000040157f in mishap::what() const ()
#2 0x0000000000401377 in main ()
Jika lebih lama, Anda hanya akan mendapatkan layar penuh pada suatu waktu dan akan ada --More--
pesan. Terus tekan enter sampai selesai. Anda sekarang dapat quit
, output akan tetap di terminal Anda. Salin semuanya mulai dari Program received signal SIGSEGV
dalam file teks, dan ajukan laporan bug dengan pelacak bug aplikasi; Anda dapat menemukan ini secara online dengan mencari, misalnya "laporan bug brokenapp" - Anda mungkin harus mendaftar sehingga balasan dapat dikirim kepada Anda melalui email. Sertakan uraian masalah Anda, argumen apa pun yang Anda berikan run
, dll., Dan salinan jejak balik (jika sangat panjang, mungkin ada cara untuk melampirkan file teks dalam antarmuka pelacak bug). Juga sertakan versi, jika Anda tahu apa itu ( brokenapp --version
dapat berfungsi, atau halaman manual dapat menunjukkan cara untuk mendapatkan ini),
Semoga seseorang akan kembali kepada Anda dalam waktu yang tidak terlalu lama. Pengarsipan bug biasanya dihargai.
gdb
melakukan banyak hal . Anda ingin mengklik ke bagian 5.1
Ini berarti aplikasi memiliki bug.
Jika Anda adalah pengguna akhir, Anda harus menghubungi vendor aplikasi.
Jika itu adalah aplikasi Anda sendiri, Anda dapat:
$ ulimit -c unlimited
$ ./yourapp
$ gdb ./yourapp core
File-file inti juga akan sangat berguna bagi para pengembang selain diri Anda - file-file tersebut berisi keadaan lengkap dari program pada saat crash; jika Anda akan mengajukan laporan bug, lampirkan mereka, dan dalam beberapa kasus biner aplikasi Anda. Perlu diketahui bahwa ada kemungkinan kecil bahwa data pribadi Anda seperti nomor akun, kata sandi, dan yang serupa dapat tetap tersimpan dalam memori program pada saat crash. Dalam banyak kasus, melaporkan backtrace dari thread yang macet adalah bantuan besar bagi pengembang untuk menemukan masalahnya. Untuk mendapatkan backtrace, Anda bisa memuat file inti dengan debugger (seperti gdb executable corefile
).