1

我有一段 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 帧转到该用户代码堆栈帧并打印变量的值(flds,指针(ipl),它们似乎没问题。显然没有 NULL 取消引用。

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

我正在寻找一些指针来帮助我调试和修复这个问题。

一些相关信息 - gcc: 4.4.4 。红帽企业 Linux 服务器 6.0 64 位 Linux

4

1 回答 1

4

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

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

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

您还可以手动搜索此类错误,使用gdb. 使用watchgdb 命令并禁用地址空间布局随机化应该会有所帮助。

我还建议始终清除您拥有free-d 的指针,因此在代码中的任何地方都替换free(x)free(x), x=NULL(因此,如果x被错误地取消引用,您将SIGSEGV立即获得)。

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

于 2012-05-01T14:56:27.673 回答