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?
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?
Antworten:
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 gdb
GNU-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 run
und drücken Sie die Eingabetaste. Wenn Sie Argumente -x --foo=bar whatever
angeben 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 quit
die Ausgabe in Ihrem Terminal bleiben. Kopieren Sie alles von Program received signal SIGSEGV
Anfang 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 --version
funktioniert 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.
gdb
macht eine Menge Sachen . Sie möchten durch Abschnitt 5.1
Dies bedeutet, dass die Anwendung einen Fehler aufweist.
Wenn Sie ein Endbenutzer sind, sollten Sie sich an den Hersteller der Anwendung wenden.
Wenn es sich um Ihre eigene Anwendung handelt, können Sie:
$ ulimit -c unlimited
$ ./yourapp
$ 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 .