Segmentation fault bei rekursiver Methode
-
Hallo,
ich habe ein Problem mit einer rekursiven Region-Grow-Methode. Mein Kollege hat eine solche zu Bildsegmentierungszwecken geschrieben, auf seinem PC (SuSe 9.3) lief das ganze auch super. Nachdem wir das dann auf meinen PC portiert hatten (OpenSuSe 10.2) gabs leider Probleme. Das Programm crasht beim Ausfuehren der Methode jedes mal an einer anderen Stelle mit einem "Segmentation Fault", d.h. jedes mal beim Zugriff auf eine andere Variable. Ich weiss, dass die Beschreibung arg vage ist, aber der Code selbst ist leider sehr spezifisch und wuerde hier nicht viel bringen. Und der Absturz ist wie gesagt voellig willkuerlich. Das ganze duerfte ubrigens keiner Speicherproblem sein, da der Spass schon nach wenigen Sekunden abstuerzt und laut Systemueberwachung noch mehr als genug freier Speicher da ist.
Hat vielleicht jemand eine Idee, wie man dem ganzen auf die Spur kommen koennte? Wir wissen nicht so wirklich weiter ...
Vielen dank schon mal fuer eure Zeit!
LG
josy
-
Segmentation Fault kann vieles bedeuten. Nimm einfach mal ein Debugger und lass dir den Stacktrace anzeigen, wenn der SegFault auftritt.
(Bei rekursiven Methoden kann es auch gut sein, dass ihr den ganzen Stack aufbraucht)
-
ok wir haben rausgefunden, dass die rekursion bei mir crasht, wenn sie eine tiefe von ca. 45 000 erreicht, auf der maschine meines kollegen laeuft sie ohne probleme bis 150 000. weiss vielleicht jemand wie ich das beeinflussen kann? also die maximale groesse des stacks fuer die rekursion?
(wir arbeiten mit C++ unter OpenSuSe 10.2 bzw SuSe 9.3)
-
mit folgendem GCC/LD-Flag -Wl,--stack,<größe in Bytes>. Siehe man: ld
-
Was genau macht die Funktion eigendlich? Ich muß zugeben das ich mir unter Region Grow so nix vorstellen kann. Mir stellt sich aber die Frage ob bei beschriebenem Problem eine rekursive Lösung tatsächlich der einzige Weg ist, denn der Ansatz ist zumindest problematisch zu nennen. Immerhin redest Du hier von 45000 verschachtelten Funktionsaufrufen...
Klar, man kann den Stack größer machen, aber damit verschiebt man das Problem auch nur.