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


40

私はコマンドラインアプリケーションを実行していますが、実行すると本来の動作が行われず、特定の時点でメッセージが表示されます:

Segmentation fault

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


回答:


63

セグメンテーションフォールトは、メモリアクセス違反の結果です。プログラムは、割り当てられたもの以外のメモリアドレスを参照しており、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、またはマニュアルページでこれを取得する方法が示されている場合)、バージョンも含めます。

うまくいけば、誰かがあなたに戻ってくるでしょう。通常、バグの提出は歓迎されます。


1
セグメンテーション違反は、インタープリター言語でも発生する可能性があります(これは主にインタープリター自体のバグによるものです)
Braiam 14

これはとても便利です!中に入る可能性はありますか?ストップマークを付けて、さらに調べてみますか?
ズロイスミアトニー

1
@ZloySmiertniy gdb多くのことを行います。セクション5.1にクリックスルーします
goldilocks

11

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

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

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

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

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


Microsoftのダイアログボックスによると、「問題が解決しない場合」にのみベンダーに連絡する必要があります。そうでなければ、気にしないでください。まれなクラッシュは実際のバグではなく、再現可能なバグです。
カズ

4
私の観察では、多くの場合、Microsoftソフトウェアの品質はUNIXソフトウェアと比較して低く、UNIXの世界では人々が通常ガイドラインを参照しないのは素晴らしいことです。
gena2x
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.