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

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

问题描述

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

  for(i = 1; i  {
/ *其他代码* /
plot_file = fopen(all_fitness.out,w); (j = 0; j< pop_size; j ++)
fprintf(plot_file,%lf%lf\\\
,oldpop [i] .xreal [0],oldpop [i] .obj );
fclose(plot_file);
/ *其他代码* /
}

我在这里得到一个SIGABRT,以下回溯:

 #0 0x_001_cn(0)$ _ $ _ )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 *** \\\

at ../sysdeps/unix/sysv/linux/libc_fatal.c在$ malloc_printerr(action =< value optimized out>,str = 0x6<地址0x6 out of bounds> ptr = 0x8055a60)的malloc.c:6217
#5 0x002696f2 189
#4 0x00267ff1在malloc.c:4750
#6 0x0026c7cd中的_int_free(av =< value optimized out>,p =< value optimized out>)malloc.c:3716 $ b中的* __ GI___libc_free(mem = 0x8055a60) $ b#7 0x0025850a in _IO_new_fclose(fp = 0x8055a60)at iofclose.c:88
#8 0x0804b9c0 in main()at ga.c:1100

行号ber 1100,是我在上述代码段中执行 fclose()的行。上述行为的原因是什么?任何指针都不胜感激。



(我在Linux上使用gcc)

解决方案>

当您调用 fclose()时,glibc会释放一些动态分配的结构;内部有一个 free()调用。 malloc() free()依赖于相当复杂,动态构建的结构。显然,glibc发现结构处于非相干状态,直到安全记忆释放不能完成。 glibc决定问题严重到足以保证立即中止。



这意味着您的代码中有某个错误,可能与您显示的代码片段相距甚远,缓冲区溢出或类似的不合适的内存写入损坏内存分配结构。



您可能想尝试 Valgrind 电动栅栏排序这些问题出来。


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

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

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.

(I am on Linux and using gcc)

解决方案

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.

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.

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

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

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