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

时间:2010-02-23 10:02:58

标签: c debugging gdb malloc

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

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 backtrace:

#4  0x002a8300 in sYSMALLOc (av=<value optimised out>, bytes=<value optimised out>) at malloc.c:3071
#5  _int_malloc (av=<value optimised out>, bytes=<value optimised out>) 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库中的错误,我需要确定它。

感谢。

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:2)

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

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

相关问题