2010-02-25 3 views
14

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

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)

+1

Вы используете один и тот же i в обоих ваших циклах, это намеренно? – IVlad

+0

@IVlad: Спасибо, что указали это. Это была ошибка в публикации вопроса. Починил это. – 2010-02-25 13:52:40

+0

Что такое сообщение malloc_printerr? Вы уверены, что fclose() вызывает сбой? Я думаю, вы должны уменьшить свой код до той части, которая вызывает проблему, и опубликовать ее ... – IVlad

ответ

14

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

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

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

+0

Привет, Томас: Да, ошибка была где-то в другом месте. Вальгринд помог мне разобраться. Итак, спасибо за ваш намек. После вашего ответа я действительно выкопал код и исправил довольно тупую, забытую ошибку. – 2010-02-25 18:54:30

1

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

+0

Я поставил чек, ничего подозрительного. Спасибо :) – 2010-02-25 13:58:07

Смежные вопросы