logo

Segmentierungsfehler, Core-Dump von Ubuntu

Was ist ein Segmentierungsfehler?

Segmentierungsfehler oder Zugriffsverletzung ( Segfault kurz gesagt) ist ein Fehlerzustand oder ein Fehler, der durch Hardware mit Speicherschutz verursacht wird und ein Betriebssystem alarmiert, das die Software versucht hat, auf einen eingeschränkten Speicherbereich zuzugreifen (eine Speicherzugriffsverletzung).

Es handelt sich um eine allgemeine Schutzfehlerform auf Standard-x86-Systemen. Als Reaktion darauf führt der Kernel des Betriebssystems in der Regel einige Korrekturmaßnahmen durch und gibt den Fehler im Allgemeinen an den fehlerhaften Prozess weiter, indem er ein Signal an den Prozess überträgt.

Java-Teilzeichenfolge

In einigen Fällen können Prozesse einen Signalhandler installieren, der ihnen eine eigenständige Wiederherstellung ermöglicht. Ansonsten wird jedoch der Standardsignalhandler des Betriebssystems verwendet, was im Allgemeinen zu einer abnormalen Beendigung des Prozesses und manchmal zu einem Core-Dump führt.

  • Segmentierungsfehler sind eine grundlegende Fehlerklasse in Programmen, die in vielen Sprachen spezifiziert sind, z C Sprache, die Low-Level-Speicherzugriff und einige wichtige Sicherheitsüberprüfungen bietet.
  • Sie entstehen in erster Linie aufgrund zahlreicher Fehler in Zeigern, die für die Adressierung des virtuellen Speichers verwendet werden, insbesondere aufgrund illegaler Zugriffe.
  • Andere Arten von Speicherzugriffsfehlern sind: Busfehler , was auch mehrere Ursachen umfasst.
  • Diese treten hauptsächlich aufgrund einer ungenauen Adressierung des physischen Speichers oder eines falsch ausgerichteten Speicherzugriffs auf.
  • Hierbei handelt es sich um einige Speicherreferenzen, die die Hardware nicht adressieren kann, anstelle von Referenzen, die der Prozess nicht adressieren darf.
  • Mehrere Programmiersprachen könnten Mechanismen anwenden, die zur Vermeidung von Segmentierungsfehlern und zur Entwicklung der Speichersicherheit entwickelt wurden. Zum Beispiel, Die Rost Die Programmiersprache wendet ein eigentumsbasiertes Modell an, um die Speichersicherheit zu gewährleisten. Eine andere Sprache wie Java Und Lispeln wendet Garbage Collection an, die viele Speicherfehlerklassen ignoriert, die Segmentierungsfehler verursachen könnten.

Übersicht über Segmentierungsfehler

  • Ein Segmentierungsfehler tritt auf, wenn ein Programm versucht, auf einen Speicherort zuzugreifen, für den es keine Zugriffsberechtigung hat, oder wenn es versucht, auf eine nicht zulässige Weise auf einen Speicherort zuzugreifen (z. B. indem versucht wird, in einen schreibgeschützten Speicherort zu schreiben oder diesen zu überschreiben). Betriebssystemteil).
  • In der Informatik das Wort 'Segmentierung' hat mehrere Verwendungsmöglichkeiten. In Anlehnung an den Segmentierungsfehler, ein Wort, das seit 1950 verwendet wird, definiert es den Adressraum des Programms. Nur der Adressraum des Programms ist mit Speicherschutz lesbar, und davon nur der Stapel und der Lese-/Schreibabschnitt des Datensegments des Programms ist beschreibbar. Daher führt der Versuch, außerhalb des Adressraums des Programms zu lesen oder in den schreibgeschützten Teil des Adressraums zu schreiben, zu einem Segmentierungsfehler.
  • Ein Segmentierungsfehler tritt auf, wenn die Hardware einen Versuch findet, auf ein nicht vorhandenes Segment, einen Ort außerhalb der Segmentgrenzen oder einen Ort in einem Stil zu verweisen, der durch die für das Segment auf den Systemen erteilten Berechtigungen, die die Speichersegmentierung verwenden, nicht zulässig ist die Hardware zur Bereitstellung von virtuellem Speicher.
  • Im Allgemeinen führt ein Fehler durch eine ungültige Seite zu einem Segmentierungsfehler auf den Systemen, die nur Paging verwenden. Die Seitenfehler und Segmentierungsfehler sind beide Fehler, die vom virtuellen Speicherverwaltungssystem herrühren. Außerdem kann ein Segmentierungsfehler unabhängig von den Seitenfehlern auftreten. Der unrechtmäßige Zugriff auf eine gültige Seite ist der Segmentierungsfehler. Der Segmentierungsfehler kann in der Mitte einer Seite auftreten. In einem Pufferüberlauf das sich auf einer Seite befindet, aber beispielsweise den Speicher illegal überschreibt.
  • Der Fehler ist zunächst entstanden MMU ( Speicherverwaltungseinheit ) auf illegalen Zugriff, als Teil seines Speicherschutzaspekts, oder auf einen Fehler durch eine ungültige Seite auf Hardwareebene. Liegt das Problem nicht an einer ungültigen logischen Adresse, sondern an einer ungültigen physikalischen Adresse, entsteht eher der Busfehler. Diese werden also nicht immer unterschieden.
  • Dieser Fehler wird gefunden und ein Signal wird an den fehlerhaften Prozess gesendet, wodurch der Handler des Prozesses für dieses Signal auf Betriebssystemebene aktiviert wird. Verschiedene Arten von Betriebssystemen haben unterschiedliche Signalnamen, um anzuzeigen, dass ein Segmentierungsfehler aufgetreten ist.
  • Ein Signal, bekannt als SIGSEGV (kurz für Segmentierungsverletzung ) wird auf den betreffenden Prozess auf den Unix-ähnlichen Betriebssystemen übertragen. Der fehlerhafte Prozess erhält eine Ausnahme, d. h. STATUS_ACCESS_VIOLATION auf Microsoft Windows.

Ursachen für Segmentierungsfehler

Die Umstände, unter denen ein Segmentierungsfehler auftritt, und wie er sich manifestiert, hängen vom Betriebssystem und der Hardware ab. Unterschiedliche Hardware verursacht unter verschiedenen Umständen unterschiedliche Fehler und unterschiedliche Betriebssysteme wandeln diese in unterschiedliche Signale um, die an die Prozesse gesendet werden.

Die bevorstehende Ursache kann eine Speicherzugriffsverletzung sein, obwohl die zugrunde liegende Ursache ein Softwarefehler verschiedener Art ist. Das Debuggen eines Fehlers oder das Ermitteln der Grundursache kann in einigen Fällen einfach sein, in denen das Programm regelmäßig zu einem Segmentierungsfehler führt. Allerdings kann es schwierig sein, die Tasche zu reproduzieren und in anderen Fällen auf die Speicherzuweisung bei jedem Lauf angewiesen zu sein.

Im Folgenden sind einige typische Ursachen für den Segmentierungsfehler aufgeführt:

  • Versuch, auf eine nicht vorhandene Speicheradresse zuzugreifen (außerhalb des Adressraums des Prozesses)
  • Der Versuch, auf den Speicher zuzugreifen, für den ein Programm keine Rechte hat (z Kernelstrukturen im Prozesskontext)
  • Versuch, einen Nur-Lese-Speicher zu schreiben (wie Codesegment )
  • Diese wiederum werden häufig durch viele Programmierfehler verursacht, die zu ungültigen Speicherzugriffen führen:
  • Versuch, ein Programm auszuführen, das nicht korrekt kompiliert werden kann. (Einige Compiler führen zu einer ausführbaren Datei, unabhängig davon, ob Fehler bei der Kompilierung vorliegen.)
  • Ein Stapelüberlauf
  • Ein Pufferüberlauf
  • Zuweisen oder Dereferenzieren auf einen freigegebenen Zeiger (a baumelnder Zeiger , was angibt, dass Speicher gelöscht/freigegeben/freigegeben wurde)
  • Zuweisen oder Dereferenzieren zu einem nicht initialisierter Zeiger (A wilder Zeiger , was eine zufällige Speicheradresse angibt)
  • Dereferenzierung auf a Null Zeiger Gibt normalerweise eine Adresse an, die nicht Teil des Adressraums des Prozesses ist

Segmentierungsfehler treten häufig aufgrund von Fehlern bei der Verwendung eines Zeigers auf, insbesondere in C dynamische Speicherzuweisung im C-Code. Dereferenzierung auf a Null Zeiger , was zu undefiniertem Verhalten führt, führt zu einem Segmentierungsfehler. Dies liegt an einem Nullzeiger, der keine gültige Speicheradresse sein kann. Der baumelnde Zeiger Und wilde Hinweise weisen auf einen Speicher hin, der möglicherweise vorhanden ist oder nicht und möglicherweise beschreibbar oder lesbar ist und daher zu vorübergehenden Fehlern führen kann.

Segmentierungsfehler in Ubuntu beheben

Dieser Fehler kann jederzeit auf unserem Ubuntu-System auftreten. Ein Segmentierungsfehler liegt vor, wenn unser System versucht, auf eine nicht vorhandene Speicherseite zuzugreifen. Kern entsorgt Definiert, wann ein Codeteil versucht, einen Schreib- und Lesevorgang an einem freien oder schreibgeschützten Speicherort auszuführen. Allgemein, Segfaults sind mit einer Datei namens core verknüpft und treten zum Zeitpunkt der Aktualisierung auf.

Bei der Ausführung einiger Befehle zum Zeitpunkt der Core-Dump-Situation könnten wir auf Folgendes stoßen: „Sperrdatei konnte nicht geöffnet werden“ Fehler. Dies liegt daran, dass das System versucht, einen Block zu übernehmen, der nicht vorhanden ist. Der Grund dafür ist der Absturz der Binärdateien einiger bestimmter Programme.

Wir debuggen möglicherweise oder gehen zurück, um das Problem zu beheben, aber die Lösung besteht darin, die defekten Pakete zu reparieren, indem wir einige Schritte implementieren, die wie folgt aufgeführt sind:

1. Entfernen Sie die an bestimmten Speicherorten verfügbaren Sperrdateien.

 $ sudo rm -rvf /var/lib/apt/lists/lock /var/cache/apt/archives/lock /var/lib/dpkg/lock and restart our system 

Segmentierungsfehler, Core-Dump von Ubuntu

2. Repository-Cache entfernen.

 $ sudo apt-get clean all 

Segmentierungsfehler, Core-Dump von Ubuntu

3. Aktualisieren und aktualisieren Sie unseren Repository-Cache.

 $ sudo apt-get update 

Segmentierungsfehler Core-Dump von Ubuntu
 $ sudo apt-get upgrade 

Segmentierungsfehler, Core-Dump von Ubuntu

4. Aktualisieren Sie nun unsere Distribution. Dadurch werden unsere Pakete aktualisiert.

 $ sudo apt-get dist-upgrade 

Segmentierungsfehler Core-Dump von Ubuntu

5. Durchsuchen Sie die kaputten Pakete und entfernen Sie sie gewaltsam.

 $ sudo dpkg -1 | grep ^..r | apt-get purge 

Eine gute Möglichkeit, die immer funktioniert, ist neben der Befehlszeile folgende:

Android-Prozess acore
  1. Starten Sie Ubuntu im Startmodus, indem Sie auf klicken Esc Schlüssel nach dem Neustart.
  2. Wählen ' Erweiterte Optionen für Ubuntu
    Segmentierungsfehler, Core-Dump von Ubuntu
  3. Führen Sie Ubuntu im Wiederherstellungsmodus aus und wir werden mehrere Optionen erwähnen.
  4. Wählen Sie zunächst die aus „Defekte Pakete reparieren“
    Segmentierungsfehler Core-Dump von Ubuntu
  5. Wählen Sie dann das aus „Normalen Start fortsetzen“
    Segmentierungsfehler, Core-Dump von Ubuntu

Jetzt haben wir zwei Möglichkeiten, Segmentierungsfehler über GUI und CLI zu beheben. Manchmal kann es auch vorkommen, dass der Befehl apt aus diesem Grund nicht funktioniert Segfault , daher wird die CLI-Methode nicht implementiert. Machen Sie sich in diesem Fall keine Sorgen, denn die GUI-Methode wird für uns immer funktionieren.

Behandeln von Segmentierungsfehlern

Die Standardaufgabe für einen Busfehler oder Segmentierungsfehler ist die abnormale Beendigung eines Prozesses, der darauf gestoßen ist. Möglicherweise wird eine Kerndatei erstellt, um das Debuggen zu erleichtern, und es können auch andere plattformabhängige Aufgaben implementiert werden. Beispielsweise verwenden viele Linux-Systeme das Grsecurity-Patch könnte sich anmelden SIGSEGV-Signale zur Überwachung auf mögliche Einbruchsversuche mit Pufferüberläufen.

Auf einigen Systemen wie Windows und Linux ist es möglich, dass ein Programm selbst einen Segmentierungsfehler verwaltet. Das laufende Programm kann das Ereignis nicht nur verwalten, sondern möglicherweise auch einige Details zu seinem Status extrahieren, z. B. die Werte des Prozessorregisters, das Abrufen eines Stack-Trace, die Zeile eines Quellcodes, als es aufgetreten ist, die Speicheradresse, auf die ungültig zugegriffen wurde usw ob es sich bei der Aufgabe um eine Schreib- oder Leseaufgabe handelte, abhängig vom Betriebssystem und der Architektur.

Was ist Java-Hashmap?

Ein Segmentierungsfehler definiert jedoch, dass ein Programm einen Fehler aufweist, der behoben werden muss. Es ist auch möglich, einen solchen Fehler absichtlich zu Testzwecken, zum Debuggen und auch zur Nachahmung von Plattformen zu verursachen, bei denen ein direkter Zugriff auf den Speicher erforderlich ist. Im letzteren Fall sollte das System in der Lage sein, die Ausführung des Programms auch nach Auftreten des Fehlers zuzulassen.

In diesem Fall ist es, wenn das System dies zulässt, möglich, das Ereignis zu verwalten und das Prozessorprogramm dagegen zu verbessern 'springen' auf die fehlgeschlagene Anweisung, mit der Ausführung fortzufahren.

Beispiele für Segmentierungsfehler

Segmentierungsfehler Core-Dump von Ubuntu

Schreiben in den Nur-Lese-Speicher

Es entsteht ein Segmentierungsfehler. Es erscheint, wenn das Programm einen Teil seines Codesegments oder den schreibgeschützten Teil des Datensegments an den Codefehlerebenen schreibt, weil diese über das Betriebssystem in den Nur-Lese-Speicher geladen werden.

Nullzeiger-Dereferenzierung

In C und anderen C-ähnlichen Sprachen werden Nullzeiger für die Bedeutung verwendet 'Zeiger auf kein Objekt' und als Fehlerindikator und Dereferenzierung im Nullzeiger (ein Schreiben oder Lesen von einem Nullzeiger) ist ein sehr grundlegender Programmfehler.

Der Standard besagt nicht, dass der Nullzeiger dem Zeiger auf die Speicheradresse 0 ähnelt, obwohl dies der Fall sein könnte. Fast alle Betriebssysteme bilden die Adresse des Nullzeigers so ab, dass ihre Verwendung zu einem Segmentierungsfehler führt.

Dieses Verhalten wird von keinem C-Standard garantiert. In C ist die Dereferenzierung des Nullzeigers die undefiniertes Verhalten , und eine konforme Implementierung darf davon ausgehen, dass ein dereferenzierter Zeiger nicht null ist.

Pufferüberlauf

Paketüberfluss