Merkwürdige Laufzeitfehler

Hallo,

ich schreibe gerade ein Programm in C++ und habe immer wieder folgendes Problem:

Ein Laufzeitfehler tritt auf, die Konsole gibt meist einen „Segmentation fault“ an. Da sich der Fehler nicht finden lässt, baue ich an verschiedenen Stellen Ausgaben ein (wirklich nur einfache Ausgabezeilen mit cout, sonst nichts) und irgendwann funktioniert alles. Wenn ich diese Zeilen dann wieder herausnehme (der Code ist dann also wieder absolut identisch mit dem Code zum Zeitpunkt des Segementations faults) funktioniert alles immer noch, es kommt aber vor, dass ich nach hinzufügen weiterer Zeilen Code oder auch erst bei einer neuen Funktion oder Klasse den gleichen Fehler wieder bekommen, der sich meist durch ändern oder hinzufügen neuer cout-Zeilen wieder beheben lässt.

Die Ursache der Fehlermeldung ist meistens, dass Funktionsargumente nicht übernommen werden, bzw. nach der Übernahme leer sind.

Da ich erst seit ein paar Monaten programmiere habe ich keine Ahnung, wie ich damit umgehen soll. Ich kann nur hoffen, dass hier jemand schonmal ein ähnliches Problem hatte oder eine Idee dazu hat… bin für jeden Hinweis dankbar!!

Ein Laufzeitfehler tritt auf, die Konsole gibt meist einen
„Segmentation fault“ an. Da sich der Fehler nicht finden
lässt, baue ich an verschiedenen Stellen Ausgaben ein
(wirklich nur einfache Ausgabezeilen mit cout, sonst nichts)
und irgendwann funktioniert alles.

Hallo,

aller Wahrscheinlichkeit nach greift dein Programm über einen Pointer ins Nirwana, also auf eine Adresse, die dem Programm nicht gehört. Entweder ist der Pointer nicht initialisiert, oder es findet Adressarithmetik statt, so dass der Pointer zwar gültig ist, aber per hohem Index über die Grenzen des Arrays hinaus zugegriffen wird. Weil deine Änderung den Fehler beseitigt, deutet das darauf hin, dass es sich um den Konstantenbereich handelt, in dem auch die ausgegebenen Texte landen. Manche Compiler lassen über einen Parameter zusätzliche Feldgrenzen-Prüfungen aktivieren, C ist hier aber eher schlecht.

Grüße, guidot

Es wäre gut mal den code als Beispiel zu POSTEN .
Dann kann man dir es genau aufzeigen . Es gibt halt sachen um die sich der Programmierer kümmern muss.

Bei mir kommt segmentaton fault nur (und das zufällig) wenn mein speicher putt ist :smile:

Benutze einen Debugger

Da ich erst seit ein paar Monaten programmiere habe ich keine
Ahnung, wie ich damit umgehen soll. Ich kann nur hoffen, dass
hier jemand schonmal ein ähnliches Problem hatte oder eine
Idee dazu hat… bin für jeden Hinweis dankbar!!

Hallo Unbekannter,

hört sich alles recht stimmig an :smile: Und selbst für erfahrene Programmierer gibt es häufig solche Fälle, in denen man sich dem Fehler annähern muss.

Gerade Anfänger glauben häufig, dass ein Programm funktioniere, wenn es ein paar mal scheinbar erfolgreich gelaufen sei. Selbst in der professionellen Entwicklung, wo mit professionellen Testverfahren geprüft wird, bleibt alle paar tausend Zeilen Code ein Fehler unentdeckt.

Insbesondere bei C ist das Debugging anspruchsvoll, weil der Ort des Fehlerabsturzes häufig nicht der der Fehlerursache sein muss. Durch das Einfügen zusätzlicher Abfragen verändert sich dabei auch der erzeugte Code und die Speicherpositionen.

Aus diesem Grunde gibt es Source-Level-Debugger, die mit dem Originalcode arbeiten. Dabei kann man z.B. feststellen, wo der Fehler bemerkt wird. Ist z.B. ein Stück Speicherplatz überschrieben, kann man dann gezielt danach suchen, in welchem Programmschritt in diesen Bereich geschrieben wird.

Wenn Du keinen solchen Debugger hast oder Dich nicht damit beschäftigen willst, kannst Du auch Deinen Quelltext analysieren.
Gerade Anfänger vergessen gerne, alle potenziellen Fehlerquellen abzutesten und halten oft wenig davon, auf scharf gestellte Compiler-Warnungen zu achten.

Ciao, Allesquatsch

Erstmal vielen, vielen Dank für die schnellen Antworten!

Den Code zu posten macht allerdings keinen Sinn, fürchte ich, da das Programm nicht grad klein ist und einige Klassen eingebunden werden. Trotz einiger debug-Versuche konnte ich bisher auch noch nicht herausfinden, wo genau der Fehler liegt.

Habe jetzt aber zumindest schonmal ein paar Ansatzpunkte, wie ich weiter verfahren kann, und werde mich mal dransetzen.

Nochmals vielen Dank!