伙计们,您能否推荐一个工具来发现使用 c++ 构建并在 linux x86_64 下工作的生产多线程服务器上的内存损坏?我目前面临以下问题:每隔几个小时,我的服务器就会因段错误而崩溃,核心转储显示 malloc/calloc 中发生错误,这绝对是某处内存损坏的迹象。
实际上,我已经尝试了一些工具,但运气不佳。这是我到目前为止的经验:
Valgrind 是一个很棒的(我什至会说是最好的)工具,但它会大大降低服务器的速度,使其无法在生产中使用。我在舞台服务器上尝试过,它确实帮助我找到了一些与内存相关的问题,但即使在修复它们之后,我仍然会在生产服务器上崩溃。我在 Valgrind 下运行了我的舞台服务器几个小时,但仍然没有发现任何严重的错误。
据说 ElectricFence 是一个真正的记忆猪,但我什至无法让它正常工作。它几乎立即在舞台服务器上随机奇怪的地方出现段错误,而 Valgrind 根本没有显示任何问题。也许 ElectricFence 不能很好地支持线程?...我不知道。
DUMA - 与 ElectricFence 相同的故事,但更糟。虽然 EF 生成了带有可读回溯的核心转储,但 DUMA 只向我显示“?????”(是的,服务器肯定是用 -g 标志构建的)
dmalloc - 我将服务器配置为使用它而不是标准的 malloc 例程,但是它在几分钟后挂起。将 gdb 附加到进程显示它挂在 dmalloc 的某个地方:(
我逐渐变得疯狂,根本不知道下一步该做什么。我有以下工具可供尝试:mtrace、mpatrol 但也许有人有更好的主意?
我非常感谢在这个问题上的任何帮助。
更新:我设法找到了错误的来源。但是,我在舞台服务器上发现它不是使用 helgrind/DRD/tsan 的生产服务器 - 多个线程之间存在数据竞争,导致内存损坏。关键是使用适当的 valgrind 抑制,因为这些工具显示了太多的误报。仍然我真的不知道如何在生产服务器上发现它而没有任何明显的减速......