Was ist ein Segmentierungsfehler?

27

In Ubuntu habe ich den Segmentierungsfehler viele Male konfrontiert. Was ist ein Segmentierungsfehler und wann tritt er auf?

Tachyonen
quelle
1
Nur um es zu vertuschen: Ich hatte ein ähnliches Problem, während meine Fehler nicht zuverlässig reproduzierbar waren und aus (fast) zufälligen Anwendungen stammten. Fand heraus, dass wahrscheinlich mein Gedächtnis kaputt ist. Wenn also ein Programm Fehler verursacht, kann man sich den Arbeitsspeicher genauer ansehen.

Antworten:

25

Ein Fehler, der Segmentierungsfehler (oder Segfault oder SIGSEGV ) in Ubuntu und anderen Unix-ähnlichen Betriebssystemen oder eine allgemeine Schutzverletzung in Windows besagt , liegt vor, wenn ein Programm versucht, auf einen Teil des Speichers zuzugreifen, auf den nicht zugegriffen werden kann oder auf den das Programm nicht zugreifen kann Es ist verboten, darauf zuzugreifen. Ein Segmentierungsfehler ist eine Art Programmabsturz, dh ein abnormaler Programmabbruch. In den Wikipedia-Artikeln zu Abstürzen , Speicherschutz , Segmentierungsfehler , allgemeiner Schutzverletzung und SIGSEGV finden Sie weitere Informationen (und ein besseres Verständnis des Themas als hier dargestellt).

Ein Segmentierungsfehler ist fast immer auf einen Programmfehler zurückzuführen, bei dem er auftritt. Ich vermute, dass die meisten oder alle Segmentierungsfehler von derselben Anwendung stammen. Bitte machen Sie nähere Angaben zu den Umständen, unter denen Segmentierungsfehler auf Ihrem Computer auftreten und welches Programm abstürzt. Bitte geben Sie auch den vollständigen und genauen Text der Fehlermeldung an, die Sie erhalten, sowie alle anderen Nachrichten, die davor angezeigt werden. Dies sollte es uns ermöglichen, eine detaillierte Beratung für Ihr Problem bereitzustellen (und nicht nur allgemeine Informationen darüber, was ein Segmentierungsfehler ist).

Sie können diese Informationen am besten bereitstellen, indem Sie Ihre Frage so bearbeiten, dass sie sie enthält . Wenn Sie alternativ möchten, dass es sich bei dieser Frage nur um Segmentierungsfehler im Allgemeinen handelt, können Sie eine neue Frage posten, um zu erfahren, was speziell Ihre Segmentierungsfehler verursacht. .

Eliah Kagan
quelle
Zum Glück werden alle Segmentierungsfehler durch ein Upgrade von os :) behoben. Meine Frage bezieht sich auf Segmentierungsfehler im Allgemeinen. Nicht für eine bestimmte App.
Tachyonen
@Ich bin nicht diese Person Ich habe meine Antwort entsprechend bearbeitet. (Ich behalte die Anweisungen für die Bereitstellung weiterer Informationen für andere Benutzer bei, bei denen Segmentierungsfehler auftreten, obwohl ich weiß, dass Sie derzeit keine spezielle Unterstützung für sie benötigen.)
Eliah Kagan,
Hier geht es um einen Segmentierungsfehler in einer App. Ich wollte fragen, ob es in einem C ++ - Programm vorkommt, in dem dasselbe Programm in Windows oder Turbo C ++ (in Wein) einwandfrei läuft (ich verwende Anjuta in Linux) , GRAFIK usw.)
Nirmik
Vielen Dank. Aber ich fürchte, in den meisten Fällen ist die Frage nach Segmentierungsfehlern in Apps hier offen. :)
Tachyons
@Nirmik: wahrscheinlich ist es das Thema für Stackoverflow :)
Tachyonen
4

Ein Segmentierungsfehler wird durch einen Fehler in der Anwendung verursacht. Technisch bedeutet dies, dass die Anwendung versucht, einen Teil des Arbeitsspeichers zu lesen oder zu beschreiben, der nicht dazu gehört (oder nicht vorhanden ist). Es ist natürlich verboten, im Speicher eines anderen zu lesen oder zu schreiben. Wenn das System (der Kernel) dies erkennt, wird die Anwendung zum Beenden gezwungen.

Vojtech Trefny
quelle
0

Vorbei sind die Zeiten, in denen Benutzer den Assembly-Code nachverfolgten und ein Problem debuggten. Abends, Dr. Watson, Segmentierungsfehler. Diese grünen Tage sind vorbei.

Einer der Gründe für einen Segmentierungsfehler ist, dass Code mit direktem Speicherzugriff fehlschlägt. Wenn ein Teil des Codes versucht, auf das Speichersegment einer anderen Anwendung zuzugreifen, tritt ein Segmentierungsfehler auf. Die Speicherzuweisungen werden manchmal verschoben, damit größere zusammenhängende Speicherblöcke zugewiesen werden können. Während der Wiederherstellung versucht der Kernel, alle seine Speicherinformationen in einer Datei zu speichern, den aktuellen Status aller auf der CPU ausgeführten Anwendungen und ihren Status (letzte Befehlsausführung) in einer Datei und stirbt einfach. Es wird auch versucht, so viele Wiederherstellungsinformationen wie möglich zu speichern und so viele Dateien wie möglich zu schließen, damit die Festplatten keine defekten Links erhalten.

Debuggen Sie es und beheben Sie es, wenn Sie es häufig reproduzieren können. Wenn Sie es nicht reproduzieren können, fassen Sie einfach Ihre Hände, knien Sie nieder und beten Sie wie die Hölle, dass Sie es nicht "regelmäßig" sehen.

Siddharth
quelle
Segfaults können in jedem Programm ausgelöst werden, das in einer Sprache geschrieben ist, die direkten Speicherzugriff ermöglicht. Sie werden im Allgemeinen auch den Kernel nicht zum Absturz bringen.
Alex L.
@AlexL. das ist genau. Ich werde meine Antwort bearbeiten.
Siddharth
Ich hoffe, ich habe meine Gedanken richtig dargestellt.
Siddharth
@AlexL. Können Sie es bitte noch einmal überprüfen. Ich werde es löschen, wenn es immer noch nicht korrekt ist.
Siddharth
Das ist besser. (1) Obwohl dies möglich ist, ist es für ein Programm äußerst selten, den SIGSEGVHandler auf etwas anderes zu setzen als SIG_DFL(dh den Core sichern und für a SIGSEGVbeenden), da beim Zugriff auf den Arbeitsspeicher etwas schief gehen sollte falsch und Erholung ist wahrscheinlich unmöglich. (2) Ein Core wird erst entleert, wenn der Prozess gestoppt wurde. (3) Der Core-Dump enthält nur den Speicher und die Register des Prozesses, für den ein Dump erstellt wurde. (4) Andere Prozesse, die CPU und der Kernel sind von einem Segfault eines anderen Prozesses nicht betroffen.
Alex L.