malloc(10844) crasht das Programm

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

malloc(10844) crasht das Programm

Beitrag von naums » Mi Mai 08, 2013 5:08 pm

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
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: malloc(10844) crasht das Programm

Beitrag von cloidnerux » Mi Mai 08, 2013 8:50 pm

Liegt es vlt an fs an sich?
Hast du es mal mit fs=100 probiert oder vorher mal gecheckt, welchen Wert fs wirklich hat?
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: malloc(10844) crasht das Programm

Beitrag von naums » Mi Mai 08, 2013 9:25 pm

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
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: malloc(10844) crasht das Programm

Beitrag von naums » Do Mai 09, 2013 9:56 am

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...
.globl truth
truth:
mov r0, #42
mov pc, lr

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: malloc(10844) crasht das Programm

Beitrag von Xin » Do Mai 09, 2013 9:31 pm

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?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
naums
Beiträge: 740
Registriert: Sa Jan 02, 2010 10:40 pm
Kontaktdaten:

Re: malloc(10844) crasht das Programm

Beitrag von naums » Sa Mai 11, 2013 4:04 pm

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
.globl truth
truth:
mov r0, #42
mov pc, lr

Antworten