In Ubuntu habe ich den Segmentierungsfehler viele Male konfrontiert. Was ist ein Segmentierungsfehler und wann tritt er auf?
In Ubuntu habe ich den Segmentierungsfehler viele Male konfrontiert. Was ist ein Segmentierungsfehler und wann tritt er auf?
Antworten:
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. .
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.
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.
SIGSEGV
Handler auf etwas anderes zu setzen als SIG_DFL
(dh den Core sichern und für a SIGSEGV
beenden), 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.