Seite 1 von 1

malloc(10844) crasht das Programm

Verfasst: Mi Mai 08, 2013 5:08 pm
von naums
Hallo.

Folgende Codezeile crasht das programm:

Code: Alles auswählen

    char* rostext=(char*) malloc(fs);
mit fs=10844. 10844 ist die Dateigröße einer Datei namens reactos.ini . Die Datei wird quasi vom selben Code erfolgreich geladen und alloziert, aber in der Client-Seite will mein Xubuntu mir den Speicher nicht geben. Reproduzierbar. Mit malloc(100) passiert der Fehler nicht.

Hat jemand eine Idee woran das liegen könnte? Laut Xfce Task-manager sind noch 2 GB von 4 GB RAM frei.

MfG

Re: malloc(10844) crasht das Programm

Verfasst: Mi Mai 08, 2013 8:50 pm
von cloidnerux
Liegt es vlt an fs an sich?
Hast du es mal mit fs=100 probiert oder vorher mal gecheckt, welchen Wert fs wirklich hat?

Re: malloc(10844) crasht das Programm

Verfasst: Mi Mai 08, 2013 9:25 pm
von naums
fs ist ein int. Mit dem Wert 10844 (mittels printf("%d\n", fs) geprüft). Selbst wenn ich 10000 hardcodiert Malloc übergebe, stirbt es. Ich führen übrigens auch vorher bereits malloc (mit niedrigeren Werten) durch. Und der selbe Code funktioniert auch eigentlich. Ich baue aus dem Code 2 Binaries; eine funktioniert einwandfrei, die übrigens diese Codesequenz ebenso benutzt; und in dem anderen stirbt das programm an malloc.

MfG

Re: malloc(10844) crasht das Programm

Verfasst: Do Mai 09, 2013 9:56 am
von naums
Okay, es liegt am Codecontext. Wenn ich die og. Zeile unter folgendem Statement ausführe, stirbt mir das Programm weg. Führe ich es davor aus, funktioniert es (stirbt aufjedenfall nicht am SegFault sondern am exit(0);

Code: Alles auswählen

                    
    char* rosTxt=(char*) malloc(10844);    // um Diese Zeile geht es.
    exit(0);
    
  //** Dieses Statement: **//
    wget=(char*) realloc(wget, str::strlen(server) + str::strlen(cfg_server->rosinf+ 50));
    sprintf(wget, "wget -O\"%s\" \"%s/%s\"", cfg_server->rosinf, server, cfg_server->rosinf);
    system(wget);
wget ist alloziierter Speicher, da steht sowas drin wie »wget -O"cache/lastUpdate.txt" "http://localhost/cache/lastUpdate.txt"«. str::strlen entspricht strlen() aus cstring. Ist ne eigene Implementation, aber tut ihren Zweck. cfg_server->rosinf ist der Ort an dem der Server die reactos.inf gespeichert hat. cfg_server->rosinf=»cache/reactos.inf«. server=»127.0.0.1«

Insgesamt soll der Codeblock vom "Server" (in dem Fall der Webserver auf meinem PC (localhost)) die Datei cache/reactos.inf herunterladen. Die Datei existiert und wird erfolgreich runtergeladen. Dennoch scheint diese Zeile verantwortlich für den Absturz zu sein...

Re: malloc(10844) crasht das Programm

Verfasst: Do Mai 09, 2013 9:31 pm
von Xin
Ich schätze mal, dass Du Dir den Stack zerlegst.
Diese Fehler führen gerne dazu, dass eine sichtbare Reaktion erst später festzustellen ist.

Interessanter als die eine Zeile wäre ein Stacktrace.
Hast Du Dein Programm mal mit gdb laufen lassen und geguckt, wo der stirbt?
Kann er noch einen Stacktrace produzieren?

Re: malloc(10844) crasht das Programm

Verfasst: Sa Mai 11, 2013 4:04 pm
von naums
Hallo.

Der Fehler lag an der malloc-Stelle von tmp_wget. Folgendes:

Code: Alles auswählen

    wget=(char*) realloc(wget, str::strlen(server) + str::strlen(cfg_server->rosinf+ 50));
    sprintf(wget, "wget -O\"%s\" \"%s/%s\"", cfg_server->rosinf, server, cfg_server->rosinf);
Ich alloziiere str::strlen(server) + str::strlen(cfg_server->rosinf +50). Gebraucht werden (man bemerke den Unterschied): str::strlen(server) + (str::strlen(cfg_server->rosinf)*2) +50.

Daran lag der Fehler. Ich danke euch.

MfG