为什么我在这里得到一个SIGABRT? [英] Why do I get a SIGABRT here?

查看:255
本文介绍了为什么我在这里得到一个SIGABRT?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有此code段中,我正在打开/关闭文件的次数(在一个循环中):

I have this code segment in which I am opening/closing a file a number of times (in a loop):

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这里,用下面的回溯:

I get a SIGABRT here, with the following backtrace:

#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()在上面的code段行。什么是上述行为的原因是什么?任何指针是AP preciated。

The line number 1100, is the line where I am doing the fclose() in the above code segment. What is the reason for the above behavior? Any pointers is appreciated.

(我是在Linux和使用gcc)

(I am on Linux and using gcc)

推荐答案

当你调用 FCLOSE(),glibc的释放一些动态分配结构;内部有一个免费()电话。 的malloc()免费()依赖相当复杂的,动态的建筑结构。显然,glibc的发现,结构是一个不一致的状态,到安全的释放内存无法做到这一点。 glibc的决定,问题是严重,足以成为一个立即中止。

When you call fclose(), glibc releases some dynamically allocated structures; internally there is a free() call. malloc() and free() rely on rather complex, dynamically built structures. Apparently, glibc found that the structures were in an incoherent state, to the point that safe memory release cannot be done. glibc decided that the problem was serious enough to warrant an immediate abort.

这意味着你有一个错误的地方在code,可能已经远离您展示片段,缓冲区溢出或类似外的地方存储器写这损害了内存分配结构远。

This means that you have a bug somewhere in your code, possibly quite far from the snippet you show, a buffer overflow or a similar out-of-place memory write which damages the memory allocation structures.

您可能想尝试 Valgrind的电围栏来这样的问题了排序。

You may want to try Valgrind or Electric Fence to sort such problems out.

这篇关于为什么我在这里得到一个SIGABRT?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆