Articles

Was tun mit einem Segmentierungsfehler 11

Aus irgendeinem Grund habe ich beschlossen, ein Produkt mit einfachem C zu erstellen. Aber als Werkzeug für persönliches Wachstum habe ich dabei viel mehr über das Programmieren gelernt.

Zum Beispiel weiß ich jetzt genauer, warum sich ein Python-Wörterbuch und eine Liste unterschiedlich verhalten und was es wirklich bedeutet, „als Referenz zu übergeben.“

Wenn es jedoch eine Barriere gäbe, die mich dazu bringen würde, nie wieder zu C zurückzukehren, wäre es der gefürchtete „Segmentierungsfehler 11“, dicht gefolgt von „Abbruchfalle 6″.“

Diese beiden Fehler treten während der Laufzeit auf, was das Debuggen erschwert. XCode, Eclipse oder andere Debugging-Tools sind sehr hilfreich, aber ich habe gelernt, dass es viel wichtiger ist, zu lernen, was diese Dinge sind, und Verfahren zu entwickeln, um den Debugging-Prozess anzugehen. Dies sind nur meine Notizen zu meinen eigenen häufigen Fehlern. Ich hoffe, dies zu einer Fehlerbehebungsliste für alle zu machen, die ihre eigenen Probleme haben. Ich möchte zumindest meine dummen Probleme abdecken, damit Sie sich auf echte Codierungsprobleme konzentrieren können.

Ein Segmentierungsfehler bedeutet, dass Ihr Programm versucht hat, auf etwas zuzugreifen, das es nicht sollte. Das ist Teil des Problems. Es gibt viele Gründe, warum ein Programm auf Dinge zugreifen kann, die es nicht soll, aber kompilierter Code sagt so ziemlich nur „#$#@^*&!“ stattdessen. Wenn Sie darüber nachdenken, möchten Sie niemandem erklären müssen, warum Sie an einer empfindlichen Stelle wütend werden, wenn Sie Sie stoßen. Sie wollen nur, dass sie aufhören, es zu tun. Glücklicherweise sind Computer nach etwa 75 Jahren Engineering sowohl dumm als auch überraschend geduldig. Sie werden weiterhin Seg-Fehler senden, aber (normalerweise) nicht aufhören, Freunde zu sein, nachdem es das 1000.

Was ist eine Abbruchfalle?

Es ist nicht viel anders. Irgendwo sagte sich Ihr Computer, das Programm abzubrechen. Wieder nicht sehr hilfreich. Es tritt jedoch normalerweise auf, wenn Sie versuchen, auf eine Zeichenfolge mit zwei Zeichen zuzugreifen string"nw" oder nicht genügend Speicher zuzuweisen char string für eine Zeichenfolge oder ein Array wie "way".

Was ist mit einem Seg-Fehler zu tun?

Die Tutorials, die ich lese, konzentrieren sich in der Regel auf die Verwendung von Debugging-Tools wie lldb, gdb und so weiter. Das ist alles schön und gut. Ja, Sie sollten zuerst gcc -g und dann lldb executable_name und dann run -flag1 -flag2 um zu sehen, ob Ihnen das hilft, es herauszufinden. Aber manchmal gibt es überhaupt keine Hilfe. Ich habe jedoch eine Liste von Dingen, nach denen ich suchen muss.

  • Überprüfen Sie, ob Ihre erforderlichen globalen Programmvariablen Werte haben. Dies geschah hauptsächlich, weil ich Flags erstellt hatte, die eine Reihe von Werten ausfüllten, die vor dem Ausführen festgelegt werden mussten. Was aber, wenn sie nichts hineinlegen? Seg Fehler 11! Es gab eine Reihe von Zeiten, in denen ich * dachte *, dass vars gesetzt wurden, wenn sie es nicht waren, und das sorgte für herausfordernde Fehler. Besser noch, versuchen Sie, Globals auf ein Limit zu beschränken, damit sie leichter zu verfolgen sind.
  • malloc ist sowohl dein Freund als auch dein Feind. Insbesondere bei Benutzereinträgen kann es sehr schwierig sein, Speicher zuzuweisen und dann zu kopieren, zu verketten und alles andere zu tun. Kennen Sie diesen Befehl gut und wie er funktioniert. Und vergessen Sie nicht, free() den Speicher, wenn Sie fertig sind!
  • Verwenden Sie char var, um die Größe eines Zeichens* für die Speicherzuweisung zu bestimmen. Der größte Teil des Problems, das ich hatte, bestand darin, Variablen zuzuweisen, um schließlich eine Zeichenfolge zu akzeptieren. Ich habe andere Ratschläge gesehen, aber wenn es eine Zeichenfolge ist, mit der Sie arbeiten, denke ich, dass strlen() am konsequentesten funktioniert hat. Sie benötigen das +1 für \0 (null), um die Zeichenfolge am Ende zu beenden.
  • verwenden Sie int arr) +1)] für Arrays anderer Typen. Es ist eine seltsame Art, Dinge zu tun, aber das ist es, was man mit einer Low-Level-Sprache bekommt.
  • \0 repräsentiert null und beendet ein Array. Dies kann hilfreich sein, wenn Sie versuchen, Pufferüberlaufprobleme zu vermeiden.
  • Versuchen Sie, definierte Konstanten so weit wie möglich zu verwenden. Wann immer Sie in der Lage sind, Dinge beim Vorkompilieren zu definieren, sparen Sie später Zeit beim Debuggen.
  • Verstehe, wofür Header-Dateien sind. Viele der Tutorials werden Ihnen sagen, was eine Header-Datei enthält, aber es ist nicht immer klar, wofür sie sind. Header-Dateien werden zur Vorkompilierungszeit erfasst und bieten eine Zusammenfassung der Variablen und Funktionen, die dem Programm * vor dem Kompilieren * zur Verfügung stehen. Dies bedeutet, dass die .im Programm enthaltene c-Dateien können auf diese Funktionen zugreifen, sofern der Datei #include <headerfile.h> hinzugefügt wird. Eine gute Konvention ist es, eine zu erstellen .h-Datei, wenn Sie eine erstellen .die meisten for-Schleifen gehen so: for (int i=0; i < stop; i++) Eine einfache Möglichkeit, eine Abbruchfalle zu haben, besteht darin, ein ≤ vor stop .
  • Halte deine Probleme in Schach. Versuchen Sie, es so zu machen, dass jede Datei ein paar diskrete Dinge tut und sonst nichts. Wenn Sie immer wieder verschiedene Dateien durchsuchen müssen, kann es sehr schwierig sein, Ihre Seg-Fehlerprobleme zu finden.
  • Computermathematik ist schwierig. Es ist nicht wirklich, aber kleine Dinge verursachen große Probleme. char variable bedeutet zum Beispiel ein Array mit zwei Elementen, aber da Indizes bei 0 beginnen, bedeutet dies, dass Sie nur bis Nummer 1 gehen können.
  • Gibt Formatzeichenfolgen als richtigen Typ aus. Glücklicherweise wird dies normalerweise zur Kompilierungszeit abgefangen, kann jedoch immer noch Probleme verursachen. Stellen Sie sicher, dass Ihr Formatzeichen %{whatever} zu der Variablen passt, die Sie einfügen möchten.

Das ist alles, was ich jetzt habe. Ich hoffe, mein Elend haben Sie einige Kopfschmerzen auf der Straße gerettet! Wenn alles andere fehlschlägt, habe ich jetzt eine Liste von Dingen, die ich überprüfen muss, bevor ich mir die Haare ausziehe!