セグメンテーション違反」とは?

背景
最近の汎用ハードウェアには、「メモリ管理ユニット」(または MMU)が含まれています。 このハードウェア機能は、Linux などのオペレーティング システムで、メモリ保護を実装するために使用されます。つまり、異なるプロセスが互いのメモリにアクセスしたり変更したりすることを防ぎます (特定の API を通して厳密に制御された方法を除く)。

「セグメンテーション違反」シグナルは、メモリ管理ユニットが、そのプロセスに属さないメモリアドレスを使用しようとしたことを検出したプロセスに送られます。
一般的な原因:プログラミングエラー
プロセスが、適切に初期化されていないポインタや、以前に割り当て解除されたメモリを指してメモリにアクセスしようとした場合、おそらくセグメンテーション違反が発生することになります。 この場合、セグメンテーション違反は、特定のプロセスまたはバイナリで、おそらく特定の状況下で発生します。
このタイプのセグメンテーション違反に対処するには、まず、すべての関連するサービスパックと保守更新を適用してください。 次に、問題が現在のコードでまだ再現可能である場合、解析のためにアプリケーション コア ダンプをキャプチャしてみます。 これに関する詳細は、TID 3054866 – How to obtain application core dumps に記載されています。
問題のあるバイナリが製品の一部としてノベルから出荷されている場合、ノベル テクニカル サービスにサービス リクエストを開き、

  • コア ダンプが発生した状況の説明、
  • 影響を受けたシステムの supportconfig -v report (supportconfig home page) 、および
  • 50 MB より小さい場合はコア ダンプ ファイルそのものを提供することです。 これより大きい場合は、サービス リクエストがエンジニアに割り当てられるのを待ち、エンジニアと協力して転送します。

問題のあるバイナリが第三者によって提供された場合、そのサポート部門に連絡して支援を求めてください。
共通の原因:バイナリおよびライブラリの不一致
Segfault は、バイナリおよび共有ライブラリの組み合わせで、(完全に)対応しないプロセスで発生する場合があります。 例えば、ライブラリの ABI (アプリケーション バイナリ インターフェイス) を変更するような方法でライブラリが更新されても、ライブラリの内部バージョン番号が更新されていない場合に発生する可能性があります。 古いバージョンのライブラリに対して構築されたバイナリは、新しいバージョンに対してロードされると、セグメンテーションフォールトを開始するかもしれません。

  • システムにファイルが破損していないか確認する (たとえば、supportconfig -v レポートで rpm-verify.txt ファイルを使用する)
  • /etc/ld.so.conf および /etc/ld.so.conf.d/* 環境変数 LD_LIBRARY_PATH や LD_PRELOAD など共有ライブラリのシステム設定も確認する
  • オブジェダンプ ツールを使用して、組み込みライブラリ検索パス オーバーライド (RPATH) のバイナリをチェックする。

共通の原因:ハードウェアまたはハードウェア設定の問題
セグメンテーション フォルトが頻繁に発生したり、異なるプロセスや明確なパターンのない場合は、システムのハードウェア (メモリ サブシステム) に問題があるか、低レベル システム構成設定が適切ではない可能性を示すことがあります。 この状況に対処する方法については、TID 3301593 – Linux system hangs or is unstableを参照してください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です