为什么我在这里获得SIGABRT?

时间:2010-02-25 13:47:32

标签: c linux debugging file-handling

我有这个代码段,我在其中多次打开/关闭文件(循环中):

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 个答案:

答案 0 :(得分:16)

当你调用fclose()时,glibc会释放一些动态分配的结构;内部有一个free()电话。 malloc()free()依赖于相当复杂的动态构建结构。显然,glibc发现结构处于不连贯状态,以至于无法安全释放内存。格里布决定问题严重到足以保证立即中止。

这意味着您的代码中有一个错误,可能距离您显示的代码段很远,缓冲区溢出或类似的异常内存写入会损坏内存分配结构。

您可能需要尝试ValgrindElectric Fence来解决此类问题。

答案 1 :(得分:1)

我不知道它是否会导致您的特定问题,但您应始终检查FILE *返回的fopen()指针,以防它NULL