Почему я получаю SIGABRT здесь? - PullRequest
15 голосов
/ 25 февраля 2010

У меня есть этот сегмент кода, в котором я открываю / закрываю файл несколько раз (в цикле):

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*/
     }

Я получаю SIGABRT здесь со следующим обратным следом:

#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

Строка с номером 1100 - это строка, в которой я делаю fclose() в приведенном выше фрагменте кода. В чем причина такого поведения? Любые указатели приветствуются.

(я использую Linux и использую gcc)

Ответы [ 2 ]

16 голосов
/ 25 февраля 2010

Когда вы вызываете fclose(), glibc освобождает некоторые динамически распределяемые структуры; внутри есть free() звонок. malloc() и free() полагаются на довольно сложные, динамически построенные структуры. По-видимому, glibc обнаружил, что структуры были в непоследовательном состоянии до такой степени, что безопасное освобождение памяти не может быть сделано. glibc решил, что проблема достаточно серьезна, чтобы оправдать немедленное прерывание.

Это означает, что у вас есть ошибка где-то в вашем коде, возможно, довольно далеко от сниппета, который вы показываете, переполнение буфера или аналогичная запись в неуместную память, которая повреждает структуры выделения памяти.

Вы можете попробовать Valgrind или Electric Fence , чтобы решить такие проблемы.

1 голос
/ 25 февраля 2010

Я не знаю, является ли это причиной вашей конкретной проблемы, но вы всегда должны проверять указатель FILE *, возвращаемый fopen(), если он NULL.

...