Laufende Anwendung endet mit "Segmentierungsfehler"

39

Ich habe eine Befehlszeilenanwendung, die beim Ausführen nicht das tut, was sie tun soll, und an einem bestimmten Punkt die folgende Meldung hinterlässt:

Segmentation fault

Was bedeutet das? Was soll ich machen?

Goldlöckchen
quelle
Related: stackoverflow.com/questions/2876357/…
Ciro Santilli Am

Antworten:

62

Ein Segmentierungsfehler ist das Ergebnis einer Speicherzugriffsverletzung. Das Programm hat auf eine Speicheradresse verwiesen, die nicht der zugewiesenen Adresse entspricht, und der Betriebssystemkern reagiert, indem er das Programm mit SIGSEGV beendet.

Dies ist ein Fehler, da es keinen Sinn macht, auf unzugänglichen Speicher zuzugreifen (dies ist nicht möglich). Fehler dieser Art sind jedoch leicht zu machen, insbesondere in Sprachen wie C und C ++ (die für viele gängige Anwendungen verantwortlich sind). Es weist entweder auf einen Fehler im Programm selbst oder auf eine Bibliothek hin, mit der es verknüpft ist. Wenn Sie den Fehler melden möchten (tun - das hilft), ist es eine gute Idee, eine Rückverfolgung der Ereignisse aufzunehmen, die zu dem Seg-Fehler geführt haben.

Dazu können Sie das Programm im gdbGNU-Debugger ausführen , das in jeder Linux-Distribution verfügbar sein sollte, wenn es nicht bereits installiert ist (das Paket heißt nur "gdb"). Wenn die fehlerhafte Anwendung "brokenapp" heißt:

gdb brokenapp

Es erscheint ein Absatz über Copyright und Lizenzierung und am Ende eine Eingabeaufforderung mit dem Cursor:

(gdb) _ 

Tippen Sie runund drücken Sie die Eingabetaste. Wenn Sie Argumente -x --foo=bar whateverangeben müssen (zB ), hängen Sie diese an ( run -x --foo=bar whatever). Das Programm wird tun, was es tut, Sie werden die Ausgabe sehen und wenn Sie interagieren müssen, können Sie (beachten Sie, dass Sie jede Art von Programm, einschließlich eines GUI-Programms, in gdb ausführen können). An dem Punkt, an dem es normalerweise zu Fehlern kommt, werden Sie Folgendes sehen:

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

Die zweite Ausgabezeile hier ist nur ein Beispiel. Geben Sie nun bt(für "Zurückverfolgen") ein und drücken Sie die Eingabetaste. Sie werden so etwas sehen, obwohl es viel länger dauern kann:

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

Wenn es länger ist, erhalten Sie immer nur einen Screenful und es wird eine --More--Nachricht angezeigt . Drücke die Eingabetaste, bis es fertig ist. Sie können jetzt quitdie Ausgabe in Ihrem Terminal bleiben. Kopieren Sie alles von Program received signal SIGSEGVAnfang an in eine Textdatei und reichen Sie einen Fehlerbericht mit dem Bug-Tracker der Anwendung ein. Sie können diese online finden, indem Sie suchen, zB "brokenapp bug report" - Sie müssen sich wahrscheinlich registrieren, damit Ihnen eine Antwort per E-Mail gesendet werden kann. Fügen Sie Ihre Beschreibung des Problems, alle Argumente, die Sie angegeben haben run, usw. sowie eine Kopie der Rückverfolgung bei (wenn diese sehr lang ist, können Sie möglicherweise eine Textdatei an die Bug-Tracker-Oberfläche anhängen). Geben Sie auch die Version an, wenn Sie wissen, um was es sich handelt ( brokenapp --versionfunktioniert möglicherweise, oder in der Manpage ist angegeben, wie Sie darauf zugreifen können).

Jemand wird sich hoffentlich in nicht allzu langer Zeit bei Ihnen melden. Das Einreichen von Fehlern ist in der Regel erwünscht.

Goldlöckchen
quelle
1
Segmentierungsfehler können auch in Interpretersprachen auftreten (dies liegt hauptsächlich an Fehlern im Interpreter selbst),
Braiam
Das ist super nützlich! Gibt es eine Möglichkeit einzutreten? ein Stoppzeichen setzen und versuchen, mehr herauszufinden?
Zloy Smiertniy
1
@ZloySmiertniy gdbmacht eine Menge Sachen . Sie möchten durch Abschnitt 5.1
Goldlöckchen
11

Dies bedeutet, dass die Anwendung einen Fehler aufweist.

  • Wenn Sie ein Endbenutzer sind, sollten Sie sich an den Hersteller der Anwendung wenden.

    • Wenn es mit einer Linux-Distribution geliefert wurde, sollten Sie einen Fehlerbericht für diese Distribution erstellen.
    • Bei nicht-kommerziellen Apps von Drittanbietern sollten Sie den Fehler dem Autor oder diesem speziellen Anwendungs-Bug-Tracker melden. Normalerweise können Sie einen Platz finden, indem Sie die Anwendungssite durchsuchen oder das Binär- / Quellpaket herunterladen.
    • Für kommerzielle Apps sollten Sie sich an den Support wenden.
  • Wenn es sich um Ihre eigene Anwendung handelt, können Sie:

    1. Core-Dateien aktivieren: $ ulimit -c unlimited
    2. reproduziere den Absturz: $ ./yourapp
    3. Debug-Absturz mit gdb: $ gdb ./yourapp core

Core-Dateien sind auch für andere Entwickler als Sie sehr nützlich. Sie enthalten den vollständigen Status des Programms zum Zeitpunkt des Absturzes. Wenn Sie einen Fehlerbericht einreichen möchten, hängen Sie diese und in einigen Fällen Ihre App-Binärdatei an. Beachten Sie, dass Ihre persönlichen Daten wie Kontonummern, Kennwörter und ähnliches zum Zeitpunkt des Absturzes möglicherweise nicht im Speicher des Programms verbleiben. In vielen Fällen ist es für Entwickler eine große Hilfe, nur das Zurückverfolgen eines abgestürzten Threads zu melden, um das Problem zu finden. Um eine Rückverfolgung zu erhalten, können Sie die Kerndatei mit einem Debugger (wie gdb executable corefile) laden .

gena2x
quelle
Laut dem Dialogfeld von Microsoft sollten Sie sich nur an Ihren Händler wenden, "wenn das Problem weiterhin besteht", andernfalls stören Sie sich nicht. Seltene Abstürze sind keine echten, sondern nur reproduzierbare Fehler.
Kaz
4
Meine Beobachtung ist, dass die Qualität von Microsoft-Software in vielen Fällen im Vergleich zur UNIX-Software gering ist, und es ist schön, dass in der UNIX-Welt die Leute normalerweise nicht auf ihre Richtlinien verweisen.
gena2x