回答:
セグメンテーションフォールトは、メモリアクセス違反の結果です。プログラムは、割り当てられたもの以外のメモリアドレスを参照しており、OSカーネルは、SIGSEGVでプログラムを強制終了して応答します。
アクセスできないメモリにアクセスしようとしても意味がないため、これは誤りです(実行できません)。ただし、特にCやC ++(多くの一般的なアプリケーションを占める)などの言語では、この種の間違いを犯すのは簡単です。プログラム自体またはリンク先のライブラリのバグを示しています。バグを報告したい場合(行う-これが役立ちます)、セグフォールトに至ったイベントのバックトレースを含めることをお勧めします。
これを行うには、プログラムをgdb
(GNUデバッガー)内で実行します。これは、Linuxディストリビューションがまだインストールされていない場合は利用可能です(パッケージは単に「gdb」と呼ばれます)。壊れたアプリケーションが「brokenapp」と呼ばれる場合:
gdb brokenapp
著作権とライセンスに関する段落が表示され、最後にカーソルのあるプロンプトが表示されます。
(gdb) _
入力run
してEnter キーを押します。引数を指定する必要がある場合(例-x --foo=bar whatever
)、それらを追加します(run -x --foo=bar whatever
)。プログラムはそれがすることを行い、出力が表示され、対話する必要がある場合は可能です(gdb内でGUIを含むあらゆる種類のプログラムを実行できることに注意してください)。通常セグメンテーション違反が発生した時点で、以下が表示されます。
Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _
ここの出力の2行目は単なる例です。今タイプbt
(「バックトレース」のため)と入力してヒット。次のように表示されますが、はるかに長い場合があります。
(gdb) bt
#0 0x00000000006031c9 in ?? ()
#1 0x000000000040157f in mishap::what() const ()
#2 0x0000000000401377 in main ()
それより長い場合は、一度に1画面分しか--More--
表示されず、メッセージが表示されます。完了するまでEnterキーを押し続けます。これquit
で、出力は端末に残ります。すべてをProgram received signal SIGSEGV
テキストファイルにコピーし、アプリケーションのバグトラッカーにバグレポートを提出します。「brokenappバグレポート」などを検索することで、これらをオンラインで見つけることができます。おそらく、返信をメールで送信できるように登録する必要があります。問題の説明、提供した引数run
など、およびバックトレースのコピーを含めます(非常に長い場合は、バグトラッカーインターフェースにテキストファイルを添付する手段があるかもしれません)。また、バージョンがわかっている場合(バージョンが機能する場合brokenapp --version
、またはマニュアルページでこれを取得する方法が示されている場合)、バージョンも含めます。
うまくいけば、誰かがあなたに戻ってくるでしょう。通常、バグの提出は歓迎されます。
gdb
は多くのことを行います。セクション5.1にクリックスルーします
これは、アプリケーションにバグがあることを意味します。
エンドユーザーの場合、アプリケーションのベンダーに連絡する必要があります。
独自のアプリケーションの場合、次のことができます。
$ ulimit -c unlimited
$ ./yourapp
$ gdb ./yourapp core
コアファイルは、自分以外の開発者にとっても非常に役立ちます。クラッシュの瞬間のプログラムの完全な状態が含まれています。バグレポートを提出する場合は、それらを添付し、場合によってはアプリバイナリも添付してください。アカウント番号、パスワードなどの個人データがクラッシュ時にプログラムのメモリに残る可能性はわずかであることに注意してください。多くの場合、クラッシュしたスレッドのバックトレースだけを報告することは、開発者が問題を見つけるのに非常に役立ちます。バックトレースを取得するには、デバッガでコアファイルをロードできます(などgdb executable corefile
)。