Was bedeutet es?
Siehe AU: Was ist ein Segmentierungsfehler? und auch das was einige Beispiele hat wie man es reproduziert, SO: Was ist ein Segmentierungsfehler? . Die einfachste Beschreibung, mit der ich kommen kann (ist möglicherweise nicht die perfekte):
Das Programm hat versucht, auf einen Speicherbereich außerhalb seines eigenen Abschnitts zuzugreifen. Betriebssystem blockiert es.
Einige Fälle: Wert mit initialisiertem Zeiger lesen, Bereichsüberschreitung in einem Array, Funktionsaufruf (wenn Abwärtskompatibilität nicht beibehalten wird), ...
Es ist jedoch nicht immer einfach, die Ursache bei großen Programmen oder solchen, die auf anderen Projektbibliotheken basieren, zu finden. In den meisten Fällen wird ein Fehlerbericht erstellt, entweder für das Zielprogramm oder für eines, wenn es von den Abhängigkeiten abhängt (entweder für das vorgelagerte Projekt oder das nachgelagerte Distributionspaket).
Wie kann ich dieses Problem beheben?
Wenn Sie keine benutzerdefinierte Konfiguration / Einrichtung vorgenommen und alle Updates installiert haben. Fehlerbericht auslösen , siehe Wie melde ich einen Fehler?
Wenn Open Source von Ubuntu unterstützt wird, benutze ubuntu-bug( apport-bug). Überprüfen Sie für geschlossene Quellen von Drittanbietern deren Hilfeseiten, wie Fehler gemeldet und zugehörige Daten gesammelt werden.
Hinweis: Wenn Sie sogar ein wenig Programmierkenntnisse haben, wird empfohlen, dass Sie Ihr Bestes geben, um diese selbst zu beheben. Es gibt viele Fehlerberichte, die seit Jahren inaktiv sind. Oder sammeln Sie zumindest genügend Debug-Daten, um das Problem zu beheben, bevor Sie es melden.
Einige nützliche Tools zum Debuggen
apport-bug logs / core dump / backtrace
Wenn vor dem Segmentierungsfehler keine Fehlermeldung angezeigt wird. Führen Sie es mit der --saveOption aus und suchen Sie nach dem Rückverfolgungsprotokoll:
apport-bug program-cmd --save bug-report_output.txt
gdb Quellcode zurückverfolgen / debuggen
Wenn es nicht funktioniert hat, benutze gdb:
$ gdb program-cmd
(gdb) run
(gdb) backtrace
Wenn Sie eine Fehlermeldung erhalten, überprüfen Sie das Web, das Launchpad und den Upstream-Projekt-Bug-Tracker, falls es ähnliche Fälle gibt.
Einige erfahrene Benutzer oder Benutzer, die dem Lernpfad von ac / c ++ folgen, können die entsprechenden -dbgSymbolpakete herunterladen . Anschließend können Sie den gdbProgrammfluss durch die Quelle verfolgen und die genaue Funktion / Anweisung abrufen, die den Laufzeitfehler auslöst.
strace Ablaufverfolgung von Systemaufrufen
Ein weiteres Tool, das helfen kann, ist strace, dass es mir gefällt. Es ist wirklich ein mächtiges Werkzeug.
Es stellt sich vor:
Im einfachsten Fall wird straceder angegebene Befehl ausgeführt, bis er beendet wird. Es fängt die von einem Prozess aufgerufenen Systemaufrufe und die von einem Prozess empfangenen Signale ab und zeichnet sie auf. Der Name jedes Systemaufrufs, seine Argumente und sein Rückgabewert werden als Standardfehler oder in die mit der Option -o angegebene Datei gedruckt.
straceist ein nützliches Diagnose-, Anleitungs- und Debugging-Tool. Systemadministratoren, Diagnostiker und Problemlöser werden es für die Lösung von Problemen mit Programmen von unschätzbarem Wert finden, für die die Quelle nicht ohne weiteres verfügbar ist, da sie nicht neu kompiliert werden müssen, um sie zu verfolgen. Studenten, Hacker und allzu Neugierige werden feststellen, dass viel über ein System und seine Systemaufrufe gelernt werden kann, indem sogar gewöhnliche Programme verfolgt werden. Und Programmierer werden feststellen, dass, da Systemaufrufe und -signale Ereignisse sind, die an der Benutzer- / Kernel-Schnittstelle auftreten, eine genaue Untersuchung dieser Grenze sehr nützlich ist, um Fehler zu isolieren, die Richtigkeit zu überprüfen und Rennbedingungen zu erfassen.
Quelle: man strace
ltrace dynamische Bibliotheksaufrufverfolgung
ltraceist ein Programm, das einfach den angegebenen Befehl ausführt, bis es beendet wird. Es fängt die von dem ausgeführten Prozess aufgerufenen dynamischen Bibliotheksaufrufe und die von diesem Prozess empfangenen Signale ab und zeichnet sie auf. Es kann auch die vom Programm ausgeführten Systemaufrufe abfangen und drucken.
Seine Verwendung ist strace(1) sehr ähnlich .
Quelle: man ltrace