実行中のアプリケーションが「セグメンテーションエラー」で終了します。

実行中のアプリケーションが「セグメンテーションエラー」で終了します。

実行時に予期したタスクを実行せずにある時点でメッセージを残すコマンドラインアプリケーションがあります。

Segmentation fault

どういう意味ですか?どうすればいいですか?

答え1

セグメンテーションエラーメモリアクセス違反の結果です。プログラムは割り当てられたアドレス以外のメモリアドレスを参照し、オペレーティングシステムカーネルはSIGSEGVを使用してプログラムを終了して応答します。

アクセスできないメモリにアクセスしようとすると意味がないため、エラーが発生します(不可能)。ただし、この種の間違いは、特にCやC ++(多くの一般的なアプリケーションを占める)などの言語で発生しやすいです。プログラム自体またはリンクされたライブラリにバグがあることを示します。バグを報告するには(これを行う - 役に立ちます)、以下を含めることをお勧めします。逆追跡セグフォルトを発生させたイベントです。

これを行うには、プログラム(GNUデバッガ)を内部的に実行するgdbか、インストールされていない場合はすべてのLinuxディストリビューション(パッケージ名は「gdb」)で実行できます。破損したアプリが「brokenapp」と呼ばれる場合:

gdb brokenapp

著作権とライセンスに関するセクションが表示され、カーソルの付いたプロンプトが表示されます。

(gdb) _ 

Enterを押してrunEnterを押します。パラメータ(たとえば-x --foo=bar whatever)を指定する必要がある場合は、これらのパラメータ(run -x --foo=bar whatever)を追加してください。プログラムはそのタスクを実行し、出力を表示し、対話が必要な場合はそれを行うことができます(GUIプログラムを含むgdb内であらゆる種類のプログラムを実行できます)。通常、セグフォルトが発生する場所には以下が表示されます。

Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _

ここで、出力の2行目は単なる例です。ここでbt("backtrace")と入力してEnterを押します。もっと長いかもしれませんが、次のようなものが表示されます。

(gdb) bt
#0  0x00000000006031c9 in ?? ()
#1  0x000000000040157f in mishap::what() const ()
#2  0x0000000000401377 in main ()

時間が長いと、一度に1つの画面しか表示されず、メッセージが表示されます--More--。完了するまでEnterキーを押し続けます。これで出力がquit端末に保持されます。すべてのコンテンツをテキストファイルにコピーし、Program received signal SIGSEGVアプリのバグトラッカーを使用してバグレポートを送信します。たとえば、「brokenapp bug report」を検索してオンラインでこの情報を見つけることができます。電子メールで返信を送信するには、登録が必要な場合があります。問題の説明、提供された引数runなど、およびバックトレースのコピーが含まれます(長い場合は、バグトラッカーインターフェースにテキストファイルを添付する方法があるかもしれません)。それが何であるかを知っている場合は(brokenapp --version機能しているかもしれませんが、マニュアルページでどのように入手するかがわかります)、バージョンと使用しているディストリビューションも含めてください。

誰かがすぐにあなたに連絡することを願っています。通常、バグを提出することをお勧めします。

答え2

これは、アプリケーションにバグがあることを意味します。

  • エンドユーザーの場合は、アプリケーションベンダーに連絡する必要があります。

    • Linuxディストリビューションが付属している場合は、そのディストリビューションのバグレポートを作成する必要があります。
    • サードパーティの非商用アプリケーションでは、作成者またはそのアプリケーションのバグトラッカーにバグを報告する必要があります。通常、アプリケーションサイトを参照するか、バイナリ/ソースパッケージをダウンロードして場所を見つけることができます。
    • 商用アプリケーションの場合は、サポートチームに連絡する必要があります。
  • 独自のアプリケーションの場合は、次のことができます。

    1. コアファイルを有効にする:$ ulimit -c unlimited
    2. 衝突を再現するには:$ ./yourapp
    3. gdbを使用して競合をデバッグします。$ gdb ./yourapp core

コアファイルは、あなた以外の開発者にとっても非常に便利です。これには、クラッシュ時のプログラムの完全な状態が含まれます。バグレポートを送信する場合は、そのファイルを添付し、場合によってはアプリケーションバイナリも添付してください。競合が発生した場合、個人データ(アカウント番号、パスワードなど)がプログラムメモリに残っている可能性が高くなります。ほとんどの場合、競合が発生したスレッドのバックトラッキングのみを報告すると、開発者が問題を発見するのに大きな助けになる可能性があります。バックトレースを取得するには、デバッガを使用してコアファイル(たとえばgdb executable corefile)をロードできます。

関連情報