C - calloc 调用失败,代码崩溃



我有一段 C 代码,如下所示,它在下面的 calloc() 调用时崩溃:

... some code
free (ipl->fldptr);
ipl->fldptr = calloc (flds*4, sizeof(struct fldptr_type));
...some more code

我试图 gdb 它,并在崩溃时得到以下回溯:

Program received signal SIGSEGV, Segmentation fault.
0x0000003ade478f94 in _int_malloc () from /lib/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.7.el6.x86_64 libgcc-4.4.4-13.el6.x86_64 libstdc++-4.4.4-13.el6.x86_64
(gdb) bt
#0  0x0000003ade478f94 in _int_malloc () from /lib/libc.so.6
#1  0x0000003ade4796d8 in calloc () from /lib/libc.so.6
#2  0x0000000000daf00d in myfunction (ipl=0x106f75f0, flds=11)
    at myfile.c:1286

作为调试的一部分,我在gdb提示符下执行以下操作:

第 2 帧转到该用户代码堆栈帧并打印变量(FLD,指针(IPL))的值,它们看起来还可以。显然没有空取消引用。

但是 calloc() 仍然失败并在那里崩溃。 这段代码以前被成功执行过多次,但是当应用程序运行了一段时间后,它就会崩溃。(内存泄漏?? 尝试让 valgrind 在其上运行,但碰巧在 valgrind memcheck 工具下运行时,我的代码崩溃行为不可重复)

正在寻找一些指针来帮助我调试和解决此问题。

一些相关信息 - gcc: 4.4.4 .Red Hat Enterprise Linux server 6.0 64 位 Linux

你可能

有一个损坏的堆,例如一些内存过早地free-d(并且仍然重用),或者一些缓冲区溢出(或像ptr[-3]这样的无效访问)

您应该使用 valgrind 来调试此类问题。

您也可以使用Boehm的保守垃圾收集器。

您也可以使用 gdb .使用 watch gdb 命令并禁用地址空间布局随机化应该会有所帮助。

我还建议始终清除您free -d 的指针,因此将代码中所有位置free(x)替换为 free(x), x=NULL(因此,如果x被错误地取消引用,您将立即得到SIGSEGV)。

您也可以使用具有堆栈保护器功能的较新版本的 GCC(当前版本为 4.7)。看到这个问题。

最新更新