sysmalloc:断言失败 - 任何想法如何有效地调试?
Posted
技术标签:
【中文标题】sysmalloc:断言失败 - 任何想法如何有效地调试?【英文标题】:sYSMALLOc: Assertion failed - any ideas how to debug effectively? 【发布时间】:2010-02-23 10:02:57 【问题描述】:我的服务器守护程序在大多数机器上都可以正常工作,但是在我得到的一台机器上:
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=<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 库中的错误,我需要确定。
谢谢。
【问题讨论】:
用-O0
重新编译你的守护进程(没有优化)——也许_int_malloc
和sYSMALLOc
的acktrace 中的参数值会有所帮助
我同意,无需优化即可重新编译并确保包含调试符号,然后通过 valgrind 运行它。 Valgrind 的输出实际上比断言抛出的噪音更有帮助。
【参考方案1】:
这几乎可以肯定是由于代码中的堆损坏错误(在分配块之前或之后编写)。
由于您显然是在 Linux 上, 此处使用的工具是 Valgrind。它应该直接指出问题所在,即使在守护进程“工作”的机器上也应该这样做。
尝试使用 Valgrind 以外的任何方法来解决这类问题可能是浪费时间。
【讨论】:
【参考方案2】:该断言几乎肯定表明在调用malloc
之前存在某种内存损坏。鉴于断言在xmpp_ctx_new
中出现故障,这似乎是libstrophe
XMPP 库中的一个非常早的调用,我想说这个错误很可能在你的代码中(尽管如果你可能不会)重新分配几个 XMPP 上下文 - 不确定是否有任何理由这样做)。
如果您只分配一个 XMPP 上下文,则可以通过在调用 xmpp_ctx_new
之前插入对 malloc(sizeof(xmpp_ctx_t))
的调用来隔离代码中的错误,您会发现问题不在 libstrophe 中。 (顺便说一句,我很确定问题不会出现在对xmpp_ctx_new
的调用中,因为我用谷歌搜索了函数的源代码(mem=0x0 看起来可能会导致问题),并且看到它基本上减少到@ 987654328@ 和一些初始化程序 - 阅读源代码通常是查找 OSS 中的错误的好策略。)
【讨论】:
以上是关于sysmalloc:断言失败 - 任何想法如何有效地调试?的主要内容,如果未能解决你的问题,请参考以下文章
在没有进行任何代码更改的情况下突然出现错误“调试断言失败错误”。 (在 C++ 代码中)
Spring SAML + ADFS:响应没有任何可以通过主题验证的有效断言