PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C-Programm bricht einfach ab



Thallo
17-11-2007, 20:28
Hallo,

mein Programm zur Durchführung einer [rekursiven] heuristischen Suche (auf ein 8-Puzzle-Problem) wird bei zu großer Tiefe einfach beendet, manchmal mitten in einem printf-Befehl.
Es kommt keine Fehlermeldung, aber wenn ich strace ausführe, kommt am Ende:


(...)
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV (core dumped) +++
Process 10190 detached

Da hat der Suchbaum etwa die Tiefe 174.428 und 261.644 Knoten, die in einer verketteten Liste abgelegt sind.

Mit dem Debuggen kenne ich mich ansonsten leider nicht sehr gut aus...

Betriebssystem ist Ubuntu 7.04 Feisty Fawn mit GCC 4.1, auf einem Intel Core Duo 2 x 1,7 GHz.

Woran könnte das Abbrechen des Programms liegen und kann ich es irgendwie verhindern (z.B. mit irgenwelchen gcc-Flags, ...)?

Vielen Dank schonmal im Voraus!

pcb
18-11-2007, 01:12
Das Abbrechen liegt wahrscheinlich daran, dass der Stack einfach erschoepft. Bei Rekursion wird bei jedem Call ein neuer Stackframe erstellt. Wenn der Kernel keinen freien zusammenhaengenen Speicher mehr findet, der Stack also nicht mehr "wachsen" kann, fuehrt das zu einem Abbruch.

anda_skoa
18-11-2007, 11:57
Wenn ein Programm, so wie in diesem Fall, ein Speicherabbild liefert ("core dumped"), kann man das mit einem Debugger analysieren, um genauere Informationen über den Ort der Speicherverletzung zu erhalten.

Aber wenn du wirklich eine Rekursion mit dieser Tiefe hast, ist das ziemlich sicher ein Stackproblem.

In so einem Fall bleibt einem bei gleichem Algorithmus meistens nur die Möglichkeit, die Rekursion mit einem Datenstack in eine Iteration zu überführen.

Ciao,
_