Ein Zugangsverstoß erfolgt, wenn die CPU zu dem Anweisungssatz außerhalb ihres Speicherbereichs versucht oder an einen reservierten Ort liest oder schreibt, der nicht vorhanden ist, was zu einem Segmentierungsfehler führt. Die vorliegende Anwendung wird als Ergebnis dieser Aktion gestoppt, und ein als Segmentierungsfehler bezeichnetes Ergebnis wird generiert. Da Daten häufig über Speicherregionen in einem System geteilt werden und der Programmspeicherraum zwischen Anwendungen geteilt wird, tritt dieses Problem auf.
Einige Maschinen können Segmentierungsfehler erleben, während andere dies nicht tun. In diesem Fall bedeutet dies normalerweise, dass Sie ein Problem mit Ihrem Code haben, und wir haben es geschafft, mit diesem System mit diesem System durchzukommen. Alles hängt davon ab, wie das Gedächtnis organisiert ist und ob es Null ist oder nicht. Wir werden untersuchen, wie das Programm des Programms in diesem Artikel identifiziert werden kann.
Was ist der Segmentierungsfehler??
Ein Segmentierungsfehler, der häufig als Segfault bezeichnet wird, ist eine Art Computerfehler, der auftritt, wenn der Prozessor aufgrund eines unerwarteten Zustands versucht, auf eine Speicheradresse außerhalb des Programmspeicherbereichs zuzugreifen. Der Begriff „Segmentierung“ bezieht sich auf die Speicherschutzmethode eines virtuellen Speichersystems. Wenn wir mit Zeigern in C ++/C arbeiten, treffen wir häufig auf dieses Problem.
Verwenden von GDB -Compiler zum Segmentierungsfehler
Um herauszufinden, warum die C -Programme einen Segmentierungsfehler erstellen, werden wir GDB verwenden. Das GDB ist ein C- (und C ++) -Debugger. Es ermöglicht das Programm, zu einem bestimmten Punkt zu lief. Der GDB -Debugger wird uns helfen, herauszufinden, welche Linien für das Segmentierungsproblem verantwortlich sind.
Schlüsselpunkte, um Segmentierungsfehler zu verhindern
Während Speicherzugriffsausfälle die Mehrheit der Segmentierungsfehler verursachen, ist es wichtig, sicherzustellen, dass in einem Programm verwendete Zeiger immer auf akzeptable Datenorte verweisen. Im Folgenden finden Sie die Möglichkeiten zur Verhinderung von Segmentierungsfehlern.
Beispiel 1: Programm des Segmentierungsfehlers durch Derferenzzeiger aus dem Speicherblock in c
Wir veranschaulichen einen Segmentierungsfehler, bei dem wir versuchen, Zugriff auf die Adresse des Zeigers zu erhalten, der freigelassen hat. In der folgenden Hauptfunktion des C -Programms haben wir die Zeigervariablendeklaration „int* a“ und haben den Speicher der Zeigervariablen „A“ den Speicher zugeteilt. Es wird ein Segmentierungsfehler erzeugt, wenn das Programm versucht, aus dem Derercencing -Zeiger zu lesen *a.
#enthaltenBei der Zusammenstellung des oben angezeigten Codes auf dem Bildschirm unten bewirkt die Zeile *A = 50 einen Segmentierungsfehler.
Beispiel 2: Programm des Segmentierungsfehlers durch Zugriff auf Array aus der Bond in C
In den meisten Fällen tritt ein Segmentierungsfehler auf, wenn ein Programm versucht, Speicher über seine Grenzen hinaus zu lesen oder zu schreiben. Im folgenden Programm haben wir ein Array von Index „10“ deklariert und versuchen, den Index eines Arrays zu holen, das nicht gebunden ist, und initialisiert ihn mit dem numerischen Wert. Dies ist der Punkt, an dem wir Segmentierungsfehler erhalten, nachdem wir die außergewöhnliche Linie des Programms ausgeführt haben.
#enthaltenWir befinden uns im GDB -Compiler, wo wir den Befehl GDB List verwendet haben. Der Befehl GDB List hat die Codezeile aus dem Ventilprogramm gedruckt. Aus der Zeile „Myarr [1000] = 2“ haben wir einen Segmentierungsfehler. Sie können es in der folgenden GDB -Konsole sehen.
Beispiel 3: Programm des Segmentierungsfehler
Referenzen sind Zeiger in Programmiersprachen, die angeben, wo ein Element im Speicher gespeichert ist. Ein Nullzeiger ist ein Zeiger, der auf keinen gültigen Speicherort verweist. Im folgenden Programm haben wir eine Zeigervariable „Pointerval“ deklariert und sie einen Nullwert zugewiesen. Die Ausnahme von Nullzeiger wird geworfen oder Segmentierungsfehler treten auf.
#enthaltenDas Ergebnis des obigen Programms hat bei Ausführung in Zeile „*pointerval = 10“ Segmentierungsfehler geworfen.
Beispiel 4: Programm des Segmentierungsfehlers durch Stapelüberlauf in C
Auch wenn der Code keinen einzelnen Zeiger hat, ist er kein Zeigerprobleme. Der Stapelüberlauf tritt dann auf, wenn die rekursive Funktion wiederholt aufgerufen wird und den gesamten Stapelspeicher verbraucht. Speicherbeschäftigung kann auch auftreten, wenn der Stapel keinen Platz mehr hat. Es kann durch Rückkehr aus der rekursiven Funktion mit einem Basiszustand fixiert werden.
Hier im Programm haben wir die Hauptfunktion und im Körper der Hauptfunktion haben wir eine weitere Hauptfunktion aufgerufen. Dies führt zu Segmentierungsfehler aufgrund des Stapelüberlaufs.
#enthaltenSie können sehen, dass der GDB -Compiler den Segmentierungsfehler online gibt.
Abschluss
Der Artikel beleuchtet, was Segmentierungsfehler sind und wie wir sie durch den GDB -Compiler debuggen können. Der GDB -Compiler bestimmt, welche Linien für den Segmentierungsversagen verantwortlich sind. Die Debugging -Sitzung von Segmentierungsfehlern ist mit einem GDB -Compiler in der C -Programmierung sehr einfach zu handhaben. Dann haben wir verschiedene Szenarien genommen, in denen Segmentierungsfehler auftreten können. Ich hoffe, dieser Artikel hat die Segmentierungsfehlerprobleme klargestellt.