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?
debugging
segmentation-fault
Goldlöckchen
quelle
quelle
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:Es erscheint ein Absatz über Copyright und Lizenzierung und am Ende eine Eingabeaufforderung mit dem Cursor:
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: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: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 jetztquit
die Ausgabe in Ihrem Terminal bleiben. Kopieren Sie alles vonProgram 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 habenrun
, 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.
quelle
gdb
macht eine Menge Sachen . Sie möchten durch Abschnitt 5.1Dies 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 .quelle