gpt4 book ai didi

c - 很难跟踪内存损坏 - 使用 Valgrind 运行时可以正确无误地运行

转载 作者:太空狗 更新时间:2023-10-29 14:51:50 26 4
gpt4 key购买 nike

我们有一个复杂的程序,可以在没有实现多线程的情况下很好地处理重型输入(实际上是任何输入)。
我们已经使用线程池实现了多线程,并且根据这些输入参数我得到了这些结果:
(注意:我说没有错误,这意味着我已经使用 valgrind -v 进行了测试,当我说没有内存泄漏,这意味着我已经使用 valgrind --leak-check=full -v 对其进行了测试。

  1. small_file:在超过 1 个 worker(线程)的情况下成功运行,没有 valgrind 错误,没有内存泄漏
  2. medium_file: 1 名工作人员成功运行,没有错误/内存泄漏。有> 1名 worker ,我得到:通常是堆损坏错误,b。双免。当使用 valgrind -v 和 > 1 个工作程序运行时,程序成功完成。此外,valgrind 不会打印任何错误,即 ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

现在我没有从 valgrind 得到任何错误,我该怎么做才能找到这个复杂而庞大的应用程序中的内存损坏问题?

开发环境:
Ubuntu,64 位,gcc 版本:4.7.2 和 4.8.1(不同的计算机,较新版本的 Ubuntu)。

最佳答案

Now that I don't get any errors from valgrind to start with, what can I do to find the memory corruption problem in this complex and big application?

好吧,让我向您描述一下我在 1990 年代发现微软 JavaScript 实现中的内存泄漏时所做的工作。

首先,我确保在我的程序的调试版本中,尽可能多的内存分配被路由到相同的辅助方法。也就是说,我将 mallocnew 等重新定义为我自己编写的分配器的同义词。

那个分配器只是操作系统虚拟堆内存分配器的一个薄壳,但它有一些额外的智能。它在 block 的开头和结尾分配了额外的内存,并用标记值、到目前为止分配数量的线程安全计数以及所有分配的线程安全双向链表填充了内存。 “免费”例程将验证双方的哨兵值是否仍然完好无损;如果不是,那么某处存在内存损坏。它会从链接列表中取消链接 block 并将其释放。

在任何时候,我都可以向内存管理器询问内存中所有未完成 block 的列表,这些 block 按照分配的顺序排列。卸载 DLL 时留在列表中的任何项目都是内存泄漏。

这些工具使我能够非常轻松地实时发现内存泄漏和内存损坏。

关于c - 很难跟踪内存损坏 - 使用 Valgrind 运行时可以正确无误地运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22617714/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com