多线程客户端上的内存损坏

时间:2014-09-08 18:51:50

标签: c multithreading valgrind

经过多天未能找到并纠正错误,我来找你。 我正在用libsmpp34

开发一个SMPP多线程客户端

经过充电测试后,我已多次见过:

  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_不再触发问题?

0 个答案:

没有答案