我们有一个复杂的程序,可以在没有实现多线程的重型输入(实际上是任何输入)上很好地工作。
我们已经实现了线程池的多线程,并给予这些输入参数,我得到这些结果:
(注:如果我说没有任何错误,这意味着我已经测试了valgrind -v
,当我说没有内存泄漏,这意味着我已经测试过它与valgrind --leak-check=full -v
)。
valgrind -v
与> 1个worker一起运行时,程序将成功完成。另外,valgrind也不会打印错误ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
。既然我没有从valgrind开始遇到任何错误,那么该如何解决这个复杂而又庞大的应用程序中的内存损坏问题呢?
开发环境:
Ubuntu,64位,gcc版本:4.7.2和4.8.1(不同的计算机,较新的Ubuntu版本)。
有了> 1名工人,我得到:通常是堆损坏错误,b.double-free。当使用valgrind -v和> 1个工作程序运行时,程序成功完成
基于以上症状,在我看来,您的程序中显然存在某种同步问题。看起来您的程序正在线程之间共享堆内存地址,因此,每当发生某些数据争用时,您都会遇到问题。
您还提到过,当您运行valgrind -v时,程序将成功完成。这表明您的程序有同步问题,并且也取决于序列/时序。这些是最难发现的错误之一。我们还应该记住,动态工具在程序执行并执行错误操作之前不会发出任何警告。我的意思是程序中可能有问题,但是执行顺序(由于存在一些与计时相关的问题)决定了工具是否会捕获这些故障。
话虽这么说,我认为在大型程序中找不到这种bug的捷径还可以,但是我强烈怀疑某些数据竞速方案会导致内存损坏/双重释放。因此,您可能需要使用Helgrind来检查/查找可能导致内存损坏的数据争用/线程问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句