Apa artinya?
Lihat AU: Apa itu kesalahan segmentasi? dan juga ini yang memiliki beberapa contoh bagaimana mereproduksinya, SO: Apa itu kesalahan segmentasi? . deskripsi paling sederhana yang dapat saya berikan (mungkin bukan yang sempurna):
Program mencoba mengakses area memori di luar bagiannya sendiri. OS memblokirnya.
Beberapa kasus: Nilai bacaan dengan pointer yang diinisialisasi, Keluar dari jangkauan dalam array, Panggilan fungsi (ketika kompatibilitas ke belakang tidak dipertahankan), ...
Namun tidak selalu mudah menemukan penyebabnya dengan program besar atau yang menyampaikan pada lib proyek lain. Dan sebagian besar kasus berakhir dengan laporan bug, baik untuk program target atau satu jika dependensinya (baik proyek hulu atau paket distribusi hilir).
Bagaimana saya bisa mengatasi masalah ini?
Jika Anda tidak melakukan konfigurasi / pengaturan khusus dan Anda semua pembaruan diinstal. Buat laporan bug , lihat Bagaimana cara melaporkan bug?
Jika open source didukung oleh penggunaan Ubuntu ubuntu-bug( apport-bug). Untuk sumber tertutup pihak ketiga, periksa halaman bantuan mereka bagaimana melaporkan bug dan mengumpulkan data terkait.
Catatan: Jika Anda memiliki sedikit latar belakang pemrograman, disarankan agar Anda mencoba yang terbaik untuk menyelesaikannya sendiri. Ada banyak laporan bug di luar sana yang tidak aktif selama bertahun-tahun. Atau setidaknya mengumpulkan cukup data debug untuk menyelesaikan masalah sebelum melaporkannya.
Beberapa Alat yang Berguna untuk Debugging
apport-bug log / core dump / backtrace
Jika Anda tidak memiliki pesan kesalahan sebelum kesalahan segmentasi. Jalankan dengan --saveopsi dan cari back-trace log:
apport-bug program-cmd --save bug-report_output.txt
gdb kode sumber backtrace / debuging
Jika tidak berhasil, gunakan gdb:
$ gdb program-cmd
(gdb) run
(gdb) backtrace
Jika Anda mendapatkan pesan kesalahan, periksa web, launchpad, dan di pelacak bug proyek hulu jika ada kasus serupa.
Untuk beberapa pengguna tingkat lanjut atau yang mengikuti jalur pembelajaran ac / c ++, mereka dapat mengunduh -dbgpaket simbol yang sesuai . Kemudian Anda dapat menggunakan gdbuntuk melacak aliran program melalui sumber dan mendapatkan fungsi / instruksi yang tepat yang meningkatkan kesalahan runtime.
strace pelacakan panggilan sistem
Alat lain yang dapat membantu adalah strace , saya menyukainya. Ini benar-benar alat yang ampuh.
Itu muncul dengan sendirinya:
Dalam kasus paling sederhana, stracejalankan perintah yang ditentukan sampai keluar. Ini memotong dan merekam panggilan sistem yang dipanggil oleh suatu proses dan sinyal yang diterima oleh suatu proses. Nama setiap panggilan sistem, argumennya dan nilai baliknya dicetak pada kesalahan standar atau ke file yang ditentukan dengan opsi -o.
straceadalah alat diagnostik, pengajaran, dan debugging yang berguna. Administrator sistem, diagnostik, dan penembak masalah akan merasa sangat berharga untuk menyelesaikan masalah dengan program yang sumbernya tidak tersedia karena tidak perlu dikompilasi ulang untuk melacaknya. Pelajar, peretas, dan yang terlalu ingin tahu akan menemukan bahwa banyak yang dapat dipelajari tentang suatu sistem dan panggilan sistemnya dengan melacak bahkan program-program biasa. Dan programmer akan menemukan bahwa karena panggilan sistem dan sinyal adalah peristiwa yang terjadi pada antarmuka pengguna / kernel, pemeriksaan dekat dari batas ini sangat berguna untuk isolasi bug, pemeriksaan kewarasan dan berusaha untuk menangkap kondisi ras.
Sumber: man strace
ltrace penelusuran panggilan perpustakaan dinamis
ltraceadalah program yang hanya menjalankan perintah yang ditentukan sampai keluar. Ini memotong dan merekam panggilan perpustakaan dinamis yang dipanggil oleh proses yang dieksekusi dan sinyal yang diterima oleh proses itu. Itu juga dapat memotong dan mencetak panggilan sistem yang dibuat oleh program.
Penggunaannya sangat mirip dengan strace(1).
Sumber: man ltrace