【发布时间】:2012-05-11 02:02:00
【问题描述】:
我有一段 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() 仍然失败并且它在那里崩溃。这段代码之前成功执行了多次,但是当应用程序运行一段时间后它会崩溃。 (Mem leak ?? tryint to get valgrind run on it,但碰巧在valgrind memcheck工具下运行时,我的代码崩溃的行为是不可重复的)
我正在寻找一些指针来帮助我调试和修复这个问题。
一些相关信息 - gcc: 4.4.4 。红帽企业 Linux 服务器 6.0 64 位 Linux
【问题讨论】:
-
很可能您已经损坏了堆并破坏了 *alloc() 内部数据结构。查找此类错误的更简单方法是通过
valgrind运行您的程序。