Menjalankan aplikasi diakhiri dengan "Kesalahan Segmentasi"


Jawaban:


63

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 rundan 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 SIGSEGVdalam 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 --versiondapat 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.


1
Kesalahan segmentasi dapat terjadi juga dalam bahasa juru bahasa (melalui sebagian besar karena bug dalam juru bahasa itu sendiri),
Braiam

Ini sangat berguna! Apakah ada kemungkinan untuk masuk? beri tanda berhenti dan coba cari tahu lebih lanjut?
Zloy Smiertniy

1
@ZloySmiertniy gdbmelakukan banyak hal . Anda ingin mengklik ke bagian 5.1
goldilocks

11

Ini berarti aplikasi memiliki bug.

  • Jika Anda adalah pengguna akhir, Anda harus menghubungi vendor aplikasi.

    • Jika disertai dengan distribusi Linux, Anda harus membuat laporan bug untuk distribusi itu.
    • Untuk aplikasi non-komersial pihak ketiga Anda harus melaporkan bug kepada penulis atau pelacak bug aplikasi khusus ini. Biasanya Anda dapat menemukan tempat dengan menelusuri situs aplikasi atau paket biner / sumber yang diunduh.
    • Untuk aplikasi komersial, Anda harus menghubungi dukungan.
  • Jika itu adalah aplikasi Anda sendiri, Anda dapat:

    1. aktifkan file inti: $ ulimit -c unlimited
    2. mereproduksi crash: $ ./yourapp
    3. debug macet dengan gdb: $ 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).


Menurut kotak dialog Microsoft, Anda hanya boleh menghubungi vendor Anda "jika masalahnya tetap ada", jika tidak jangan repot-repot. Kecelakaan yang jarang terjadi bukanlah bug nyata, hanya yang dapat direproduksi.
Kaz

4
Pengamatan saya adalah bahwa kualitas perangkat lunak Microsoft rendah dalam banyak kasus dibandingkan dengan perangkat lunak UNIX, dan itu bagus bahwa di dunia UNIX orang biasanya tidak merujuk pada pedoman mereka.
gena2x
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.