Memory 如何测试内存泄漏?

Memory 如何测试内存泄漏?,memory,memory-leaks,Memory,Memory Leaks,我们有一个具有数百种可能的用户操作的应用程序,并考虑如何增强内存泄漏测试 目前,它是这样发生的:当手动测试软件时,如果我们的应用程序似乎消耗了太多内存,我们使用内存工具,找到原因并修复它。这是一个相当缓慢且效率不高的过程:问题发现较晚,并且依赖于一个开发人员的良好意愿 我们如何才能改进这一点 内部检查某些操作(如“关闭文件”)是否恢复了一些内存并记录了它 在单元测试中断言内存状态(但这似乎是一项乏味的任务) 是否定期手动检查 每次实施新用户故事时是否包括该检查 在我的公司,我们为我们的应用程序

我们有一个具有数百种可能的用户操作的应用程序,并考虑如何增强内存泄漏测试

目前,它是这样发生的:当手动测试软件时,如果我们的应用程序似乎消耗了太多内存,我们使用内存工具,找到原因并修复它。这是一个相当缓慢且效率不高的过程:问题发现较晚,并且依赖于一个开发人员的良好意愿

我们如何才能改进这一点

  • 内部检查某些操作(如“关闭文件”)是否恢复了一些内存并记录了它
  • 在单元测试中断言内存状态(但这似乎是一项乏味的任务)
  • 是否定期手动检查
  • 每次实施新用户故事时是否包括该检查

    • 在我的公司,我们为我们的应用程序编程了一条无休止的行动路径。java垃圾收集器应该清理所有未使用的映射和列表等。因此,我们让应用程序从无休止的操作路径开始,看看内存使用大小是否在增长

      检查哪些字段未被删除您可以使用JProfiler for Java。

      哪种语言

      我会使用Valgrind之类的工具,尝试充分运用程序,看看它报告了什么。

      第一道防线:

      • 具有公共内存的检查表 与分配相关的错误 开发者
      • 编码准则
      第二道防线:

      • 代码审查
      • 静态代码分析(作为构建过程的一部分)
      • 内存分析工具

      如果使用非托管语言(如C/C++),可以通过劫持内存管理函数有效地发现大部分内存泄漏。例如,您可以跟踪所有内存分配/释放。

      在我看来,问题的核心与其说是查找内存泄漏,不如说是知道何时测试内存泄漏。你说你有很多用户操作,但你没有说什么用户操作序列是有意义的。如果你能随机生成有意义的序列,我很难支持随机测试。在随机测试中,你会测量

      • 代码覆盖率(使用gcovor)
      • 内存使用率(带)
      • 用户操作本身的覆盖范围
      我所说的“用户行为的覆盖范围”是指以下陈述:

      • 对于每一对动作A和B,如果有一个有意义的动作序列,其中A紧跟着B,那么我们已经测试了这样一个序列
      如果这不是真的,那么你可以问A对和B对的分数是多少

      如果您有足够的CPU周期,那么在每次提交到源代码存储库之前或在夜间构建期间运行或使用另一个内存检查工具也可能会使您受益匪浅

      自动化

      用您的自定义版本替换新的和删除,并记录分配/解除分配的每个动作


      一般来说(不是关于测试,而是为了解决问题的根源),smartpointers有助于避免这个问题。幸运的是,C++11标准提供了新的方便的智能指针类(
      shared_ptr
      unique_ptr
      )。

      您使用的是什么语言?它是垃圾收集语言,像java或perl还是非GC语言,如C++或C++?有静态分析工具、内存分析工具和其他可用的技术,但是如果没有关于实现的任何细节,就很难给出可用的答案。