So debuggen Sie Segmentierungsfehler in C?

So debuggen Sie Segmentierungsfehler in C?

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.

  • Da Speicherzugriffsfehler die Mehrheit der Segmentierungsfehler verursachen, ist es wichtig sicherzustellen, dass Anwendungszeiger immer auf gültige Datenorte hinweisen.
  • Vor der Derferenz einer anfälligen Referenz, wie beispielsweise eine in eine Struktur eingebettete Struktur, die in einer Liste oder einem Array aufbewahrt wird, sollten wir Assert aufrufen ().
  • Denken Sie immer daran, Zeiger richtig zu initialisieren.
  • Ein Mutex oder ein Semaphor kann verwendet werden, um gemeinsame Ressourcen vor gleichzeitiger Zugriff beim Multithreading zu schützen.
  • Wir sollten die Free () -Funktion verwenden

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.

#enthalten
int main (int argc, char ** argv)

int* a;
*a = 50;
Rückkehr 0;

Bei 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.

#enthalten
int main (int argc, char ** argv)

int myarr [10];
Myarr [1000] = 2;
Rückkehr 0;

Wir 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.

#enthalten
int main (int argc, char ** argv)

int *pointerval = null;
*Pointerval = 10;
Rückkehr 0;

Das 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.

#enthalten
int main (void)

hauptsächlich();
Rückkehr 0;

Sie 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.