我的服务器守护程序在大多数计算机上工作正常,但我得到的是:
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库中的错误,我需要确定它。
感谢。
答案 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中的错误的好策略。)