经过充电测试后,我已多次见过:
malloc.c:3091: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
(gdb) bt
#0 0x00000000004b6165 in raise (sig=<optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
#1 0x00000000004773b1 in abort () at abort.c:92
#2 0x0000000000483430 in __malloc_assert (assertion=<optimized out>, file=<optimized out>,
line=<optimized out>, function=<optimized out>) at malloc.c:352
#3 0x000000000048655a in sYSMALLOc (av=<optimized out>, nb=<optimized out>) at malloc.c:3088
#4 _int_malloc (av=0x7fffe0000020, bytes=1040) at malloc.c:4762
#5 0x000000000048812f in __libc_malloc (bytes=1040) at malloc.c:3655
#6 0x000000000046684e in build_tlv (dest=0x7ffff37e9750, source=0x7ffff37e9150)
at ../src/smpp34_params.c:107
奇怪的是,它只发生在Suse上运行的测试机器上而不是Debian上的另一台机器上(eglibc)
cat /etc/*-release
LSB_VERSION="core-2.0-noarch:core-3.2-noarch:core-4.0-noarch:core-2.0-x86_64:core-3.2-x86_64:core-4.0-x86_64"
SUSE Linux Enterprise Server 11 (x86_64)
VERSION = 11
PATCHLEVEL = 2
用glibc:
ldd (GNU libc) 2.11.3
其他奇怪的事情,在Valgrind上,程序运作完美。我想这是由修改后的环境引起的。最后,Valgrind说没有发现泄漏。显示的唯一内容是条件跳转到uninit值。
为了进行调试,我尝试删除所有free()
,但没有任何更改。
在那之后,我试图激活mcheck。
设置MALLOC_CHECK_会阻止程序崩溃,这很奇怪,如果MALLOC_CHECK_=2
必须在stdout和abort()
上写入错误消息。
如果我unset MALLOC_CHECK_
错误又回来了..
什么可能导致这种奇怪的行为?
我检查了我的mallocs和我的自由。没什么好看的。你有一些线索或帮助吗?
谢谢!
编辑: 这是代码的一部分。与我的链表结构相关。 http://pastebin.com/Wu2KMPLX
正如所讨论的那样,它似乎可能是一个流氓指针。你有想法追踪它们吗? 为什么设置MALLOC_CHECK_不再触发问题?