この投稿では、メッセージ ファイル内の segfault メッセージを分析し、アプリケーションまたはオペレーティング システム側で問題を特定する方法について説明します。
「セグメンテーション違反」とは?
セグメンテーション違反 (多くの場合、segfault と短縮されます) またはアクセス違反は、メモリ アクセス違反についてオペレーティング システム (OS) に通知するために、メモリ保護を備えたハードウェアによって発生する障害です。 Linux カーネルは何らかの修正アクションを実行することで応答し、通常は問題のあるプロセスに #11 のようなシグナルを送信して障害を渡します。場合によっては、プロセスはカスタム シグナル ハンドラーをインストールして、独自に回復できるようにすることもできますが、それ以外の場合は、Linux の既定のシグナル ハンドラーが使用されます。通常、segfault はプロセスを終了させ、適切な ulimit 設定でコア ダンプを生成します。
確認方法
1.セグメンテーション違反
通常、セグメンテーション違反は、特定のプロセスまたはプログラムのエラーを意味するだけです。 Linux カーネルのエラーを示すものではありません。カーネルはプロセスまたはプログラムのエラーを検出し、(一部のアーキテクチャでは) 以下のようにログに情報を出力します:
01
2.このメッセージの詳細は何を意味しますか?
RIP 値は命令ポインタ レジスタ値で、RSP はスタック ポインタ レジスタ値です。エラー値は、ページ フォールト エラー コード ビットのビット マスクです (arch/x86/mm/fault.c から):
10
エラービットの定義は次のとおりです:
28
エラーコード 15 は 1111 ビットです。最後に、次のように 1111 の意味を知ることができます:
32
このメッセージは、プロセスがユーザー モードでメモリの予約済みセクションへのアクセスを書き込もうとしたため、アプリケーションが保護違反をトリガーしたことを示します。