Programm endet mit Error-Code 0xC00000FD
-
Hi,
wollte gerade ein Programm eines Kollegen auf meinem Rechner kompilieren, das auch definitiv bei ihm funktioniert und es wird auch sauber gelinkt und kompiliert, aber beendet sich sofort mit Error-Code 0xC00000FD.
Habe natürlich mal angefangen das Programm zu debuggen und es sieht so aus, dass schon bevor die erste Zeile Quelltext ausgeführt wird, der Debugger einen Fehler meldet und zwar:
Program received signal SIGSEV, segmentation fault.
Habe das Programm mit MinGW kompiliert, mein Kollege hat es vermutlich mit gcc für Linux kompiliert.
Hat jemand eine Idee woran das liegen könnte und wie ich das Programm zum laufen kriege?
-
"Segmengation fault" bedeutet im Klartext, daß du in Speicherbereichen unterwegs bist, die nach Ansicht des Betriebssystems nicht dir gehören. Ich würde da auf einen nicht initialisierten Zeiger tippen.
(wenn der Absturz schon vor der main() auftritt, liegt es vermutlich an den globalen Variablen)
-
Hm also globale Variablen sehen wie folgt aus:
int lx, ly, lz, shadow, intensity; int komponente = 3; int increment = 1; static double sx[260][260][260], sy[260][260][260], sz[260][260][260]; char *Config_Filename, *option;
Habe auf deinen Hinweis dann mal die letzte Zeile geändert zu:
char *Config_Filename = NULL, *option = NULL;
Das ändert aber nichts.
Mir fielen ansonsten noch die double arrays auf, da das ja intern auch über Zeiger realisiert ist, oder?
Habe mich dabei auch gefragt was das static eigentlich ändern soll; das hätte doch nur in Funktionen einen Einfluss, oder?
-
Also diese Variablen sehen harmlos aus. Hast du eigentlich dein gesamtes Programm aus einer C-Datei heraus übersetzt oder aus mehreren Teilen zusammengelinkt?
Außerdem erinnere ich mich, daß globale Variablen mit Nullen initialisiert werden, wenn man nichts anderes sagt. Problematisch wird es nur, wenn du sie mit einer Funktion initialisierst, die nicht-initialisierte lokale Zeiger verwendet - oder wenn sich mehrere Variablen aus unterschiedlichen Übersetzungseinheiten aufeinander beziehen.PS: static hat bei globalen Variablen eine andere Bedeutung - das besagt, daß die betroffene Variable nur innerhalb der Übersetzungseinheit gültig ist, in der sie steht.
-
Das ganze ist in einer einzigen C-Datei.
Ich vermute, dass das ganze irgendwas mit Compiler oder Betriebssystem zu tun hat, da das Program unter Linux wohl einwandfrei lief.
-
Wie sehen denn die Einstellungen für den Speicher aus (Heap, Stack)
Die double Arrays brauchen ja schon 421824000 Bytes (etwas über 400 MiB).(Wo werden eigentlich globale Variablen abgelegt?)
-
Habe jetzt explizit nichts an den Einstellungen für Heap und Stack geändert. Im Quelltext steht auch nichts.
Was gibt es denn da überhaupt für Einstellungen und wo kann ich die machen? Muss ja wohl dann irgendwo dem Compiler oder Linker übergeben werden!?
Hab mich damit noch nie beschäftigt...
-
Globale Variablen werden normalerweise im Data-Segment abgelegt, und ich tippe mal einfach, dass die Summe deiner double-Arrays ein Default-Limit im Mingw sprengt.
Mal abgesehen davon, dass globale Variablen meistens überflüssig sind, Multithreading behindern, auf mangelndes Wissen oder Faulheit des Programmierers hinweisen:
gestalte die Arrays mal mit dynamischem Speicher (malloc/calloc).
-
Ja das Programm ist wie gesagt nicht meins und ich versuche noch nach allen Kräften zu vermeiden, dass ich mich da einarbeiten muss, weil es ziemlich lang ist.
Weiß jemand wie man MinGW sagt, dass er es mit anderen Limits kompiliert?
-
Nur aus Neugierde, was macht das Programm eigendlich und wieso brauchst du dazu 3 dreidimensionale Array?
-
Im Grunde macht das Programm nicht viel mehr als Datenpunkte in Objekte einer Renderskriptsprache (POVRay) zu übersetzen; die einzelnen sx[i][j][k], sy[i][j][k], sz[i][j][k] sind dann die Ausrichtung des Objekts mit diesen Koordinaten.
-
Wutz schrieb:
..., auf mangelndes Wissen oder Faulheit des Programmierers hinweisen:
Wie es aussieht hast recht gehabt.
-
Das Programm ist jetzt halt so wies ist; dann versuche ich schon auf dem einfachsten Wege das ganze zum Laufen zu kriegen, ja.
-
Evtl. hilft es wenn du die 3 Arrays als float deklarierst.
Achte nochmal auf Seiteneffekte falls da mit Zeigern drangegangen wird.
-
Habs mal versuchsweise als float deklariert, aber der Fehler bleibt der gleiche. Die Speichereinsparung reicht da scheinbar nicht...
-
Hat jemand ne Ahnung wie man MinGW sagen kann, dass er mehr Speicher reserviert?
-
Du wirst dir schon ein 64-Bit-Windows zulegen müssen, wenn du 400 Megabyte als globale Variablen haben willst. Unter 32-Bit-Windows sind von 4 GB virtuellen Adressraums 2 GB für den Kernel reserviert, die restlichen 2GB teilen sich das Codesegment, Heaps (davon gibt's unter Windows pro Prozess u.U. mehrere), Stacks, static storage und diverse Systemschnittstellen. Pack den Kram auf den Heap, da hast du eine Chance, 400 MB unterzubringen.
-
Büschn alt, aber ich kann mit Mingw die Arrays global deklarieren auf winXP 32bit, 4 GB (davon 3.24 nutzbar). Der Fehler liegt nicht in der Deklaration sondern woanders.