私は現在、系統発生的ANOVAを実行する統計モデリングスクリプトを実行しています。データセット全体を分析すると、スクリプトは正常に実行されます。しかし、サブセットを取得すると、分析が開始されますが、セグメンテーション違反ですぐに終了します。これが私の側からの問題(たとえば、分析用のサンプルデータセットから小さいものまで)やスクリプトのバグが原因である可能性があるのか、またはこれが私のLinuxシステムに関係しているのかをグーグルで判断することはできません。私はそれがメモリへのデータの書き込みに関係していると読みましたが、なぜより大きなデータセットですべてがうまくいくのですか?グーグルを使ってもっと多くの情報を見つけようとしましたが、これはそれをより複雑にしました。
事前に明確にしていただきありがとうございます!
承認された回答:
(tl; dr:ほぼ間違いなく、プログラムまたはプログラムが使用するライブラリのバグです。)
セグメンテーション違反は、メモリアクセスが合法ではなかったことを示します。つまり、発行されたリクエストに基づいて、リクエストされたページが常駐していないか、リクエストと一致しない権限を持っているため、CPUはページフォールトを発行します。
その後、カーネルは、このページについて何も知らないのか、まだメモリにないのでそこに置く必要があるのか、または特別な処理(コピーオンなど)を実行する必要があるのかを確認します。 -書き込みページは読み取り専用であり、この有効 ページフォールトは、ページをコピーしてアクセス許可を更新する必要があることを示している場合があります)。マイナーvsメジャー(デマンドページングなど)と無効なページフォールトについては、ウィキペディアを参照してください。
セグメンテーション違反が発生した場合は、無効なケースを示しています。プロセスには仮想アドレス空間のページが論理的にマッピングされていないため、ページがメモリ内にあるだけでなく、カーネルにも実行する修復アクションがありません。そのため、これはほぼ確実に、プログラムまたはその基盤となるライブラリの1つにバグがあることを示しています。たとえば、プロセスに対して無効なメモリの読み取りまたは書き込みを試みています。アドレスがたまたま有効だった場合、スタックが破損したり、他のデータに落書きされたりした可能性がありますが、 un マップされたページはハードウェアによってキャッチされます。
小さいデータセットではなく大きいデータセットで機能する理由は、そのプログラムに完全に固有です。これはおそらく、そのプログラムのロジックのバグであり、何らかの理由で小さいデータセットに対してのみトリップされます(たとえば、データセットにエントリの総数を表すフィールド。更新されていない場合、プログラムは他の健全性チェックを行わないと、割り当てられていないメモリに盲目的に読み込まれる可能性があります。
単にソフトウェアのバグであるよりも数桁少ない可能性がありますが、セグメンテーションフォールトは、メモリの障害、CPUの障害、ハードウェアのエラッタのトリップなどのハードウェアの問題の指標でもある可能性があります(例として、ここを参照)。
関連:Debian –インタラクティブなプロンプトで個々のdebian 8パッケージのインストールを自動化しますか?ハードウェアの障害が原因でsegfaultが発生すると、動作が動作することがよくありますが、間に何も実行しないと、プログラムを繰り返し実行しても、物理RAMの不良ビットが同じようにマップされる可能性があります。 memtest86 +を起動してRAMの障害をチェックし、Prime95などのソフトウェアを使用してCPU(FP math FMA実行ユニットを含む)のストレステストを行うことで、この可能性をほとんど排除できます。
gdbなどのデバッガーでプログラムを実行し、セグメンテーション違反時にバックトレースを取得できます。これは、原因を示している可能性があります。
% gdb --args ./foo --bar --baz
(gdb) r # run the program
[...wait for segfault...]
(gdb) bt # get the backtrace for the current thread