1. ホーム
  2. linux

セグメンテーションメッセージの解釈

2023-11-19 18:13:55

質問

次のセグメンテーションのメッセージの正しい解釈は何ですか。

segfault at 10 ip 00007f9bebcca90d sp 00007fffb62705f0 error 4 in libQtWebKit.so.4.5.2[7f9beb83a000+f6f000]
segfault at 10 ip 00007fa44d78890d sp 00007fff43f6b720 error 4 in libQtWebKit.so.4.5.2[7fa44d2f8000+f6f000]
segfault at 11 ip 00007f2b0022acee sp 00007fff368ea610 error 4 in libQtWebKit.so.4.5.2[7f2aff9f7000+f6f000]
segfault at 11 ip 00007f24b21adcee sp 00007fff7379ded0 error 4 in libQtWebKit.so.4.5.2[7f24b197a000+f6f000]

どのように解決するのですか?

これは、実行するコードを見つけようとしてヌルポインタを追ったことによるセグメンテーションフォルトです(つまり、命令フェッチ時)。

これが共有ライブラリではなく、プログラムであった場合

実行 addr2line -e yourSegfaultingProgram 00007f9bebcca90d を実行し (そして与えられた他の命令ポインタの値でも繰り返します)、 どこでエラーが起こっているかを確認します。より良い方法は、デバッグ計装されたビルドを取得し、gdb のようなデバッガーで問題を再現することです。

これは共有ライブラリであるため

ダイナミックリンカーによってライブラリがメモリ内のどこに配置されたかを事後的に知ることはできません。この問題を gdb .

エラーの意味するもの

フィールドの内訳は以下の通りです。

  • address (この at の後) - コードがアクセスしようとしているメモリ上の場所(それはおそらく 1011 は、有効な値が設定されていると期待されるポインタからのオフセットですが、そのポインタは代わりに 0 )
  • ip - 命令ポインタ、つまり、これを行おうとしているコードが存在する場所。
  • sp - スタック ポインタ
  • error - ページフォルトのためのエラーコードです。

    /*
     * Page fault error code bits:
     *
     *   bit 0 ==    0: no page found       1: protection fault
     *   bit 1 ==    0: read access         1: write access
     *   bit 2 ==    0: kernel-mode access  1: user-mode access
     *   bit 3 ==                           1: use of reserved bit detected
     *   bit 4 ==                           1: fault was an instruction fetch
     */