GNU/Linux >> Belajar Linux >  >> Linux

Apakah "Kesalahan segmentasi" Kesalahan Sistem Atau Bug Program?

Saat ini saya menjalankan skrip pemodelan statistik yang melakukan ANOVA filogenetik. Script berjalan dengan baik ketika saya menganalisis dataset lengkap. Tetapi ketika saya mengambil subset, ia mulai menganalisis tetapi dengan cepat berakhir dengan kesalahan segmentasi. Saya tidak dapat benar-benar mengetahui dengan googling apakah ini bisa disebabkan oleh masalah dari pihak saya (misalnya sampel dataset ke kecil untuk analisis) dan/atau bug dalam skrip atau apakah ini ada hubungannya dengan sistem linux saya. Saya membacanya ada hubungannya dengan menulis data ke memori, tetapi mengapa semuanya baik-baik saja dengan kumpulan data yang lebih besar? Saya mencoba mencari lebih banyak informasi menggunakan google, tetapi ini membuatnya lebih rumit.

Terima kasih telah mengklarifikasi sebelumnya!

Jawaban yang Diterima:

(tl;dr:Ini hampir pasti bug di program Anda atau perpustakaan yang digunakannya.)

Kesalahan segmentasi menunjukkan bahwa akses memori tidak sah. Artinya, berdasarkan permintaan yang dikeluarkan, CPU mengeluarkan kesalahan halaman karena halaman yang diminta tidak tetap atau memiliki izin yang tidak sesuai dengan permintaan.

Setelah itu, kernel memeriksa untuk melihat apakah ia tidak tahu apa-apa tentang halaman ini, apakah itu belum ada di memori dan harus meletakkannya di sana, atau apakah perlu melakukan penanganan khusus (misalnya, penyalinan -halaman tulis bersifat hanya-baca, dan ini valid kesalahan halaman mungkin menunjukkan bahwa kita harus menyalinnya dan memperbarui izin). Lihat Wikipedia untuk kesalahan kecil vs besar (misalnya permintaan halaman) vs. kesalahan halaman tidak valid.

Mendapatkan kesalahan segmentasi menunjukkan kasus yang tidak valid:halaman tidak hanya tidak dalam memori, tetapi kernel juga tidak memiliki tindakan perbaikan untuk dilakukan karena proses tidak secara logis memiliki halaman dari ruang alamat virtual yang dipetakan. Dengan demikian, ini hampir pasti menunjukkan bug dalam program atau salah satu pustaka yang mendasarinya — misalnya, mencoba membaca atau menulis ke dalam memori yang tidak valid untuk proses tersebut. Jika alamat tersebut benar-benar valid, hal itu dapat menyebabkan kerusakan tumpukan atau mencoret-coret data lain, tetapi membaca atau menulis un halaman yang dipetakan ditangkap oleh perangkat keras.

Alasan mengapa ini bekerja dengan kumpulan data Anda yang lebih besar dan bukan kumpulan data Anda yang lebih kecil sepenuhnya khusus untuk program itu:itu mungkin bug dalam logika program itu, yang hanya tersandung untuk kumpulan data yang lebih kecil karena beberapa alasan (misalnya, kumpulan data Anda mungkin memiliki bidang yang mewakili jumlah total entri, dan jika tidak diperbarui, program Anda dapat membaca secara membabi buta ke dalam memori yang tidak terisi jika tidak melakukan pemeriksaan kewarasan lainnya).

Ini beberapa kali lipat lebih kecil kemungkinannya daripada sekadar bug perangkat lunak, tetapi kesalahan segmentasi juga dapat menjadi indikator masalah perangkat keras, seperti memori yang salah, CPU yang rusak, atau perangkat keras Anda tersandung ralat (sebagai contoh, lihat di sini).

Terkait:Debian – Mengotomatiskan instalasi paket debian 8 individu dengan petunjuk interaktif?

Mendapatkan segfault karena perangkat keras yang gagal sering kali menghasilkan perilaku yang terkadang berfungsi, meskipun sedikit RAM fisik yang buruk mungkin dipetakan dengan cara yang sama dalam menjalankan program secara berulang jika Anda tidak menjalankan hal lain di antaranya. Anda sebagian besar dapat mengesampingkan kemungkinan ini dengan mem-boot memtest86+ untuk memeriksa kegagalan RAM, dan menggunakan perangkat lunak seperti Prime95 untuk menguji tekanan CPU Anda (termasuk unit eksekusi FMA matematika FP).

Anda dapat menjalankan program dalam debugger seperti gdb dan mendapatkan backtrace pada saat kesalahan segmentasi, yang kemungkinan akan menunjukkan pelakunya:

% gdb --args ./foo --bar --baz
(gdb) r   # run the program
[...wait for segfault...]
(gdb) bt  # get the backtrace for the current thread

Linux
  1. Perbaiki Kesalahan PHP – Tidak aman untuk mengandalkan pengaturan zona waktu sistem

  2. Jaringan kesalahan bernama tidak dapat dijangkau dalam log sistem [Perbaiki]

  3. Bagaimana Cara Mengarahkan Info Kesalahan Program C yang Dapat Dieksekusi ke Stdout? (mac Os X)?

  1. Cara membuat halaman kesalahan khusus di cPanel

  2. Bagaimana cara mengonfigurasi halaman kesalahan khusus?

  3. Bagaimana Anda keluar dari program X11 tanpa Kesalahan

  1. Bagaimana Cara Menginstal Program Versi Lama?

  2. Cara Membuat Halaman Kesalahan Khusus

  3. Memperbaiki Sistem belum di-boot dengan systemd sebagai Kesalahan sistem init