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_mallocsYSMALLOc 的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:断言失败 - 任何想法如何有效地调试?的主要内容,如果未能解决你的问题,请参考以下文章

断言失败后继续

即使其中一些失败,如何运行所有 PyTest 断言?

在没有进行任何代码更改的情况下突然出现错误“调试断言失败错误”。 (在 C++ 代码中)

Spring SAML + ADFS:响应没有任何可以通过主题验证的有效断言

当抛出的任何错误都没有冒泡时,如何在 Promise 中进行断言?

Spring security ADFS SSO 集成 - 响应没有任何可以通过主题验证的有效断言