web-dev-qa-db-ja.com

実行中のアプリケーションが「セグメンテーション違反」で終了する

コマンドラインアプリケーションがありますが、実行すると想定された動作が実行されず、特定の時点でメッセージが残ります。

Segmentation fault

これは何を意味するのでしょうか?私は何をすべきか?

43
goldilocks

セグメンテーション違反 は、メモリアクセス違反の結果です。プログラムは、割り当てられたメモリアドレス以外のメモリアドレスを参照しました。OSカーネルは、SIGSEGVでプログラムを強制終了することによって応答します。

アクセスできないメモリにアクセスしようとしても意味がないため、これは誤りです(実行できません)。この種の間違いは、特にCやC++(一般的なアプリケーションの多くを占める)などの言語では、簡単に起こります。これは、プログラム自体またはプログラムがリンクしているライブラリのバグを示しています。バグを報告したい場合(行う-これは役立ちます)、イベントにつながったイベントのbacktraceを含めることをお勧めしますセグメント障害。

これを行うには、gdb(GNUデバッガー)内でプログラムを実行します。これは、Linuxディストリビューションからまだインストールされていない場合に使用できます(パッケージは単に壊れたアプリケーションが「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(「バックトレース」の場合)と入力して、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バグレポート」-返信をメールで送信できるように、登録する必要があります。問題の説明、runに指定した引数など、バックトレースのコピーを含めます(非常に長い場合は、バグトラッカーインターフェースにテキストファイルを添付する手段がある場合があります) )。また、バージョンがわかっている場合(brokenapp --versionが機能するか、manページにこれを取得する方法が示されている場合があります)、および使用しているディストリビューションも含めます。

誰かが長すぎずにあなたに戻ってくれることを願っています。通常、バグの提出は高く評価されています。

68
goldilocks

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

  • エンドユーザーの場合は、アプリケーションのベンダーにお問い合わせください。

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

    1. コアファイルを有効にする:$ ulimit -c unlimited
    2. クラッシュを再現:$ ./yourapp
    3. gdbでクラッシュをデバッグ:$ gdb ./yourapp core

コアファイルは、自分以外の開発者にも非常に役立ちます。クラッシュした時点でのプログラムの完全な状態が含まれています。バグレポートを提出する場合は、添付し、場合によってはアプリのバイナリを添付してください。クラッシュの瞬間に、アカウント番号やパスワードなどの個人データがプログラムのメモリに残る可能性が少しあることに注意してください。多くの場合、クラッシュしたスレッドのバックトレースのみを報告することは、開発者が問題を見つけるのに大きな助けになります。バックトレースを取得するには、(gdb executable corefileなどの)デバッガーでコアファイルをロードします。

12
gena2x