「分割エラー」はシステムエラーですか、それともプログラムエラーですか?

「分割エラー」はシステムエラーですか、それともプログラムエラーですか?

私は現在、系統発生的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

おすすめ記事