私は現在、系統発生的ANOVAを実行する統計モデリングスクリプトを実行しています。データセット全体を分析すると、スクリプトは正常に機能します。ただし、サブセットを取得すると解析が開始されますが、すぐに分割エラーのため終了します。これが私の側の問題(例:分析に使用されるサンプルデータセットが小さすぎる)やスクリプトのバグが原因であるのか、それが私の問題に関連しているのか、インターネット検索では実際には理解できません。 Linuxシステム。メモリにデータを書き込むことに関連していると読みましたが、大きなデータセットを使用すると、すべてが大丈夫なのはなぜですか?より多くの情報を見つけるためにGoogleを試しましたが、状況はより複雑になりました。
あらかじめ説明していただきありがとうございます!
答え1
(TL; DR:これはほぼ確実にプログラムやプログラムが使用するライブラリのバグです。)
分割エラーは、違法なメモリアクセスを示します。つまり、要求されたページが存在しないか、要求と一致しない権限を持っているため、要求に応じてCPUはページエラーを発生させます。
その後、カーネルは、そのページについて全く知っていないか、すでにメモリにないのでそこに入れるべきか、またはいくつかの特別な処理(例えば、ページを読んだ後にコピー・ライト)を行うべきかどうかを確認します。 - のみ、どちら効果的なページエラーは、ページをコピーし、権限を更新する必要があることを示します。 ウィキペディアを見るマイナーキーとメジャーキーの場合(例:ページング要求)無効なページエラーが発生しました。
分割エラーは誤った条件を示します。つまり、ページがメモリにないだけでなく、プロセスがそのページを仮想アドレス空間に論理的にマップしないため、カーネルが実行する修正措置はありません。したがって、これはほぼ確実にプログラムまたは基本ライブラリのいずれかのバグを表します。たとえば、プロセスに無効なメモリを読み書きしようとします。アドレスが有効な場合、スタックが破損したり、他のデータが混在する可能性がありますが、読み書きできません。連合国マップされたページはハードウェアによってキャプチャされます。
より大きなデータセットでは機能しますが、より小さいデータセットでは機能しないのは、このプログラムにのみ当てはまります。何らかの理由で、より小さなデータセットでのみ動作するプログラムロジックのバグである可能性があります(たとえば、データセットに次のフィールドがある可能性があります)。合計エントリ数を表し、更新されない場合、プログラムは割り当てられていないメモリを盲目的に読み取ることができます(他の完全性チェックを実行しない場合)。
単純なソフトウェアのバグよりはるかに低い可能性がありますが、スプリットエラーは、メモリエラー、CPUエラー、または正誤表によるハードウェアトリップなどのハードウェア問題の指標かもしれません。ここ)。
ハードウェア障害による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
答え2
アクセスが許可されていないメモリ位置にアクセスすると、分割エラーが発生します。通常、これはNULLポインタを逆参照するか、割り当てられたメモリの範囲外のメモリにアクセスするために発生します。
データセット全体は有効ですが、サブセットは無効です。
- プログラムが機能を含まないデータセットを正常に処理していることを確認してください(おそらく、データセット内の機能に基づいて配列を割り当ててから、データセット全体の既知の機能のリストに基づいて長さを想定しますか?)
- 空で問題を引き起こすグループはありますか?通常、配列が空の場合、1対1のエラーが発生しますか?
答え3
そのいずれかが原因で発生する可能性があります。 Chrisが説明したように、これはほとんどソフトウェアエラーですが、一部のハードウェアの問題(特にメモリエラーと電源障害)によってセグメントが発生する可能性があります。メモリから誤った値を読み取ると、破損した命令の実行、破損したポインタの読み取り、破損したページテーブルの使用などが発生する可能性があります。
ただし、違いは、ハードウェアベースのセグフォルトが非常に深刻であることです。ランダム100万分の1ビットのフリップイベントが原因で発生します(システムがこれよりも不安定な場合は起動しません)。一方、ソフトウェアのバグによるセグフォルトは完全に繰り返すことができます。