Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813

    [c] backtrace enorme per una semplice chiusura di un file

    ciao a tutti,
    ho spostato la scritture in un file txt dal main ad una funzione...una scemenza insomma, ma la chiama fclose scatena un putiferio. La funzione in questione è la seguente:

    codice:
    void printDataset(double* x,double* y,int n,char* file,int line_style,int symbol)
    {
    	FILE *f = fopen(file,"a");
    	int i;
    	
    	fprintf(f,"#m=%d, S=%d\n",line_style,symbol);
    	
    	for (i=0;i<n;i++)
    	{
    		fprintf(f,"%lf %lf\n",x[i],y[i]);
    	}
    	
    	fprintf(f,"\n");
    	
    	fclose(f);
    }
    in pratica, appena chiama fclose (ho usato gdb), spunta sta mappazza qua:

    *** glibc detected *** ./interpolation: free(): invalid next size (normal): 0x088b7478 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0x32cff1]
    /lib/tls/i686/cmov/libc.so.6[0x32e6f2]
    /lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x3317cd]
    /lib/tls/i686/cmov/libc.so.6(fclose+0x14a)[0x31d50a]
    ./interpolation[0x804883a]
    ./interpolation[0x804875a]
    ./interpolation[0x804933d]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x2d8b56]
    ./interpolation[0x8048691]
    ======= Memory map: ========
    002c2000-00400000 r-xp 00000000 08:01 1967986 /lib/tls/i686/cmov/libc-2.10.1.so
    00400000-00401000 ---p 0013e000 08:01 1967986 /lib/tls/i686/cmov/libc-2.10.1.so
    00401000-00403000 r--p 0013e000 08:01 1967986 /lib/tls/i686/cmov/libc-2.10.1.so
    00403000-00404000 rw-p 00140000 08:01 1967986 /lib/tls/i686/cmov/libc-2.10.1.so
    00404000-00407000 rw-p 00000000 00:00 0
    006f5000-006f6000 r-xp 00000000 00:00 0 [vdso]
    00830000-0084c000 r-xp 00000000 08:01 2348 /lib/libgcc_s.so.1
    0084c000-0084d000 r--p 0001b000 08:01 2348 /lib/libgcc_s.so.1
    0084d000-0084e000 rw-p 0001c000 08:01 2348 /lib/libgcc_s.so.1
    00dd2000-00ded000 r-xp 00000000 08:01 34 /lib/ld-2.10.1.so
    00ded000-00dee000 r--p 0001a000 08:01 34 /lib/ld-2.10.1.so
    00dee000-00def000 rw-p 0001b000 08:01 34 /lib/ld-2.10.1.so
    08048000-0804a000 r-xp 00000000 00:1c 35094620 /usr/users/tuttoweb/public_html/interpolation/interpolation
    0804a000-0804b000 r--p 00001000 00:1c 35094620 /usr/users/tuttoweb/public_html/interpolation/interpolation
    0804b000-0804c000 rw-p 00002000 00:1c 35094620 /usr/users/tuttoweb/public_html/interpolation/interpolation
    088b7000-088d8000 rw-p 00000000 00:00 0 [heap]
    b7700000-b7721000 rw-p 00000000 00:00 0
    b7721000-b7800000 ---p 00000000 00:00 0
    b78d0000-b78d1000 rw-p 00000000 00:00 0
    b78e2000-b78e4000 rw-p 00000000 00:00 0
    bfe54000-bfe69000 rw-p 00000000 00:00 0 [stack]
    Aborted

    ps.: il file viene scritto, ma il programma smette di funzionare....
    dov'è che sto sbagliando?
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  2. #2

    Re: [c] backtrace enorme per una semplice chiusura di un file

    Controlla il puntatore restituito da fopen:
    codice:
    $ man fopen
    ...
    RETURN VALUES
         Upon successful completion fopen(), fdopen(), and freopen() return a FILE pointer.
     Otherwise, NULL is returned and the global variable errno is set to indicate the error.
    ...

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    ti posto le ultime righe di gdb:

    26 fprintf(f,"\n");
    (gdb) printf "%X",f
    804C478(gdb) s
    28 fclose(f);
    (gdb) s
    *** glibc detected *** /usr/users/tuttoweb/public_html/interpolation/interpolation: free(): invalid next size (normal): 0x0804c478 ***

    vedi? il puntatore è valorizzato (infatti, il file viene scritto).
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  4. #4
    Forse lo hai già chiuso e qui lo stai chiudendo di nuovo.
    Il backtrace comunque non ha nulla di speciale: anche se per la maggior parte degli indirizzi non è riportata la procedura relativa, si può fare un "educated guess" a proposito:
    codice:
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0x32cff1] <-- altro helper di free
    /lib/tls/i686/cmov/libc.so.6[0x32e6f2] <-- helper di free
    /lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x3317cd] <-- free per liberare la memoria relativa alle strutture a cui punta il FILE *
    /lib/tls/i686/cmov/libc.so.6(fclose+0x14a)[0x31d50a] <-- fclose
    ./interpolation[0x804883a] <-- tua procedura (o al massimo stub della CRT per fclose, ma è improbabile vista la vicinanza di indirizzo alla precedente)
    ./interpolation[0x804875a] <-- tua procedura
    ./interpolation[0x804933d] <-- main
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x2d8b56] <-- codice di inizializzazione della CRT
    ./interpolation[0x8048691] <-- entrypoint dell'eseguibile
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    grazie per i tuoi consigli MItaly. D'altronde nessuno mi poteva aiutare, se non me stesso.
    Ci stavano dei casini in alcune funzioni precedenti (array overflow e cose di questo tipo) che, quando free andava a liberare un'area di memoria, scoppiava la bomba...
    adesso pare che tutto va

    grazie ancora
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  6. #6
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.