【问题标题】:How to detect if an application leaks memory?如何检测应用程序是否泄漏内存?
【发布时间】:2013-04-26 13:54:19
【问题描述】:

我有一个相当复杂的系统,运行着 30 个应用程序。一个相当复杂的 C++ 应用程序正在泄漏内存,我想我已经解决了。

到目前为止我所做的是:

  • 我使用valgrind's memcheck 执行了应用程序,它没有检测到任何问题。
  • 我使用htop 监控应用程序,发现虚拟内存和剩余内存没有增加
  • 我打算运行valgrind's massif 看看它是否使用了新内存

问题是,我怎样才能确保没有泄漏?我想如果虚拟内存停止增加,那么我可以确定没有泄漏。当我测试我的应用程序时,我会触发多次分配和释放内存的循环以确保。

【问题讨论】:

    标签: linux memory-leaks


    【解决方案1】:

    除非您确切知道应用程序分配新内存的所有条件,否则您无法确定。如果您不能诱发所有这些情况,则 valgrind 和 htop 都不会保证您的应用程序在所有情况下都不会泄漏内存。

    但您至少应该确保应用程序在正常情况下不会泄漏内存。

    【讨论】:

    • 我确实知道应用程序分配内存的条件,当然,我触发它们来测试应用程序。问题是我可以检查什么以确保没有泄漏?
    • 您需要了解应用程序的内部工作流程,尤其是在(某个时间点或某些其他事件)分配的内存应该被再次释放时。
    • 我确实知道应用程序的内部工作流程。我创建了它 :) 我还创建了单元和功能测试,但这还不足以错过内存泄漏。
    • 如果您使用 valgrind 对所有可能的输入进行了测试,那么您可以确定您的应用程序中没有内存泄漏。
    • valgrind 不会报告泄漏,如果您(例如)无休止地扩展 std::vector,因为应用程序会很好地释放该内存。或者某些使用智能指针的情况,当应用程序结束时对象被释放
    【解决方案2】:

    如果 valgrind 不报告泄漏,则在无法访问的内存区域的意义上没有泄漏(在您检查的运行期间)。这并不意味着程序不分配内存,使用它并且在不再使用它时不释放它(但它仍然可以访问)。想想例如一个典型的待办事项堆栈,您将新项目放在顶部,处理顶部的项目,然后推送另一个。永远不会回到旧的,所以用于它们的内存被浪费了,但从技术上讲这不是泄漏。

    您可以做的是监控进程的内存使用情况。如果它稳步增加,您可能会遇到问题(可能是真正的泄漏,或者某些不需要增长的数据结构)。

    如果这不是很紧迫,从长远来看,它可能会更便宜,只是让它成为......

    【讨论】:

    • 我确实使用 htop 监控进程的内存使用情况。一段时间后,看起来这个特定过程(VIRT、RES、SHR)的所有记忆都稳定了,不会进一步增长。您能否更好地解释要监控的具体内容?
    • @BЈовић,如果内存使用稳定,应该没问题。
    【解决方案3】:

    您需要使用一个名为 Valgrind 的工具。它是适用于 Linux 和 Mac OS X 操作系统的内存调试、内存泄漏检测和分析工具。 Valgrind 是一个灵活的程序,用于调试和分析 Linux 可执行文件。 按照步骤..

    只需安装 valgrind

    运行... ./a.out arg1 arg2

    现在如何使用这个命令行来开启详细的内存泄漏检测器: valgrind --leak-check=yes ./a.out arg1 arg2 valgrind --leak-check=yes /path/to/myapp arg1 arg2

    或者 您还可以设置日志文件: valgrind --log-file=output.file --leak-check=yes --tool=memcheck ./a.out arg1 arg2

    您可以检查它的日志以查找内存泄漏错误... 猫输出.file

    【讨论】:

    • 我这样做了,但 valgrind 没有报告泄漏。
    猜你喜欢
    • 2020-02-14
    • 2018-01-17
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 2012-07-16
    • 2011-08-21
    • 1970-01-01
    相关资源
    最近更新 更多