Segmentation fault - willkürliche Abstürze? Wie kann ich den Fehler finden?
-
Hallo Leute,
Mein Programm stürzt willkürlich mit einem Segmentation fault ab. Wenn ich allerdings einen großen UNBENUTZTEN speicherbereich anlege, wie Zum Beispiel:
Meine_Classe * xyz[150][150]
Läuft das Proggi problemlos.
Meine Vermutung:
Offensichtlich überschreibt mein Programm an irgendeiner Stelle seinen eigenen Speicherbereich, - wenn es in einen Fremden Bereich schreiben würde, gäb es sofort einen Segmentation fault. So aber wird der Code weiter ausgeführt, allerdings mit einigen Zerstörten Speicherbereichen, was dann irgendwann zum absturz führt.Hat jemand einen Tipp wie ich soeinen Fehler finden kann? Wie gesagt, das Programm stürzt nicht an der Stelle ab, wo der Fehler verursacht wird :(. Das Project läuft unter Windows und Linux gibt es für eines der Beiden OS vielleicht ein SpeicherMonitor oder sowas? Nutzt mir so ein SpeicherMonitor überhaupt?
Bitte, Bitte!!
Gruß
Steve
-
Also ein Segmentation Fault ist ja eine Speicherzugriffsschutzverletzung. Die tritt natürlich immer dann auf, wenn du auf Speicher zugreifst, den du nicht für dein Programm reserviert hast. In den meisten fällen hat das einer der folgenden Gründe:
=> du hast vergessen Speicher zu reservieren
=> du greifst auf mehr Speicher zu als du reserviert hast, zum Beispiel wenn du vergessen hast bei einem char* das Nullterminationszeichen ('\0') zu berechnen
=> eine Funktion ist fehlgeschlagen und gibt NULL zurück. In dem Fall kann es sein das dein Zeiger auf NULL gesetzt wird.
-
Es gibt einige Speicherchecker, z.B. EFence. Einfach mit eincompilieren ins Programm und schauen, ob er was ausspuckt.
-
Ach, hierbei reicht doch schon ein trace bzw. where mit gdb aus...
Aber dass "Meine_Classe * xyz[150][150]" noch nicht wirklich "einen Speicherbereich anlegt" weißt Du schon, oder?
-
In Arrays gehören IMHO sowieso grundsätzlich Boundchecks rein. Es ist zwar jetzt nicht gesagt, dass das Problem von einem falschen Index verursacht wird, aber zumindest nicht unwahrscheinlich. Zieh dir boost::array und bau in den op[] ein assert oder sowas rein.
-
Ja danke erstmal.
Aber ein Trace hilft gar nicht! Hab ich auch mal Probiert. Dann komme ich bis zu einer Stelle, an der eine Klasse instanziiert wird. Hier liegt der Fehler aber ja nicht!!
Wie soll ich das jetzt erklären...
Es ist ja auch so, dass das Programm nur unter Linux den SegFault bringt, und unter Windows fehlen nur einige Elemente meiner GUI (mit Qt programiert).
@nman: hm, ok wusst ich nicht, ist aber umso interessanter, dass das Programm mit dieser Anweisung (die ja dann garnichts tut) läuft!
@SnorreDev: Das klingt gut, werd ich mal probieren!
also ich werd mir das nochmal ansehen, und nochmal alle Arraygrenzen prüfen. Wobei ich nicht glaub dass das Problem eher mit Zeigern oder Objekten zusammen hängt. (Das Programm verwendet sehr viel Zeiger-Structuren)
gruss
Steve