sYSMALLOc:断言失败 – 任何想法如何有效调试?

我的服务器守护程序在大多数计算机上工作正常但是我得到的一个:

malloc.c:3074: 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回溯:

 #4 0x002a8300 in sYSMALLOc (av=, bytes=) at malloc.c:3071 #5 _int_malloc (av=, bytes=) at malloc.c:4702 #6 0x002a9898 in *__GI___libc_malloc (bytes=16) at malloc.c:3638 #7 0x0804d575 in xmpp_ctx_new (mem=0x0, log=0x0) at src/ctx.c:383 #8 0x0804916e in main (argc=1, argv=0xbffff834) at ../src/adminbot.c:277 

任何想法尝试别的吗? 我无法在我的代码中找到错误,它可能是XMPP库中的错误,我需要确定它。

谢谢。

这几乎可以肯定是由于代码中的堆损坏错误(在分配的块之前或之后写入)。

由于你显然是在Linux上,这里使用工具是Valgrind 。 它应该直接指出你的问题,它应该在你的守护进程“工作”的机器上这样做。

尝试Valgrind以外的任何其他问题可能是浪费时间。

断言几乎肯定表明在调用malloc之前存在某种内存损坏。 鉴于断言在xmpp_ctx_new跳闸,这似乎是libstrophe XMPP库中的一个非常早期的调用,我说它很可能是你的代码中的错误(尽管如果你分配了几个XMPP可能不是这样)上下文 – 不确定是否有任何理由这样做)。

如果您只分配一个XMPP上下文,则可以通过在调用xmpp_ctx_new之前插入对malloc(sizeof(xmpp_ctx_t))的调用来将错误隔离到您的代码,并且您将看到问题不在libstrophe中。 (顺便说一下,我很确定这个问题不会出现在xmpp_ctx_new调用中,因为我将源代码发送到函数(mem = 0x0看起来可能会导致问题),并且看到它基本上缩减为malloc和a很少有初始化程序 – 阅读源代码通常是寻找OSS中的错误的好策略。)