2010-02-25 18 views
14

que tienen este segmento de código en el que estoy abriendo/cerrando un archivo varias veces (en un bucle):¿Por qué obtengo un SIGABRT aquí?

for(i=1;i<max;i++) 
    { 
     /* other code */ 
     plot_file=fopen("all_fitness.out","w"); 
     for (j=0;j<pop_size;j++) 
     fprintf(plot_file, "%lf %lf\n",oldpop[i].xreal[0],oldpop[i].obj); 
     fclose(plot_file); 
     /*other code*/ 
    } 

me siento un SIGABRT aquí, con la siguiente traza:

#0 0x001fc422 in __kernel_vsyscall() 
#1 0x002274d1 in *__GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 
#2 0x0022a932 in *__GI_abort() at abort.c:92 
#3 0x0025dee5 in __libc_message (do_abort=2, fmt=0x321578 "*** glibc detected *** %s: %s: 0x%s ***\n") 
    at ../sysdeps/unix/sysv/linux/libc_fatal.c:189 
#4 0x00267ff1 in malloc_printerr (action=<value optimized out>, str=0x6 <Address 0x6 out of bounds>, ptr=0x8055a60) at malloc.c:6217 
#5 0x002696f2 in _int_free (av=<value optimized out>, p=<value optimized out>) at malloc.c:4750 
#6 0x0026c7cd in *__GI___libc_free (mem=0x8055a60) at malloc.c:3716 
#7 0x0025850a in _IO_new_fclose (fp=0x8055a60) at iofclose.c:88 
#8 0x0804b9c0 in main() at ga.c:1100 

El número de línea 1100, es la línea en la que estoy haciendo el fclose() en el segmento de código anterior. ¿Cuál es la razón del comportamiento anterior? Cualquier puntero es apreciado.

(estoy en Linux y se utiliza gcc)

+1

Estás usando el mismo yo en ambos bucles, ¿es eso intencional? – IVlad

+0

@IVlad: Gracias por señalarlo. Fue un error en la publicación de la pregunta. Arreglado. –

+0

¿Qué pasa con el mensaje malloc_printerr? ¿Estás seguro de que fclose() está causando el bloqueo? Creo que deberías reducir tu código exactamente a la parte que causa el problema y publicarlo ... – IVlad

Respuesta

14

Cuando llama al fclose(), glibc libera algunas estructuras dinámicamente asignadas; internamente hay una llamada free(). malloc() y free() se basan en estructuras dinámicas y bastante complejas. Aparentemente, glibc descubrió que las estructuras estaban en un estado incoherente, hasta el punto de que no se puede hacer una liberación segura de la memoria. glibc decidió que el problema era lo suficientemente grave como para justificar un aborto inmediato.

Esto significa que tiene un error en algún lugar de su código, posiblemente muy lejos del fragmento que muestra, un desbordamiento de búfer o una escritura de memoria fuera de lugar similar que daña las estructuras de asignación de memoria.

Es posible que desee intentar Valgrind o Electric Fence para solucionar tales problemas.

+0

Hola Thomas: Sí, el error estaba en otro lugar. Valgrind me ayudó a resolverlo. Entonces, gracias por tu pista. Después de su respuesta, realmente profundicé en el código, y he corregido un error bastante estúpido, pasado por alto. –

1

No sé si es la causa de su problema particular, pero siempre se debe comprobar el FILE * puntero devuelto por fopen() en caso de que sea NULL.

+0

He puesto un cheque, nada a pescado. Gracias :) –