2013-05-02 49 views
2

我有一个相当复杂的系统,有30个应用程序在运行。一个非常复杂的C++应用程序正在泄漏内存,我想我已经修复了它。如何检测应用程序是否泄漏内存?

什么我迄今所做的是:

  • 我执行使用valgrind's memcheck的应用程序,它检测到没有问题。
  • 我监视使用htop应用程序,我注意到,虚拟和剩余内存不增加
  • 我刨运行valgrind's massif,看看它是否采用新的内存

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

回答

0

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

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

+0

我知道应用程序分配内存的条件,当然,我会触发它们来测试应用程序。问题是我可以检查什么以确保没有泄漏? – 2013-05-02 06:54:39

+0

您需要知道应用程序的内部工作流程,特别是当(某些时间点或某些其他事件)分配的内存应该再次释放时。 – scai 2013-05-02 07:02:44

+0

我知道应用程序的内部工作流程。我创建了它:)我也创建了单元和功能测试,但这不足以错过内存泄漏。 – 2013-05-02 07:04:27

-1

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

刚刚安装的valgrind

运行... ./a.out ARG1 ARG2现在

如何使用此命令行打开详细的内存泄漏检测器: Valgrind的--leak检查= YES ./a.out ARG1 ARG2 的valgrind --leak检查= YES /路径/到/ MYAPP ARG1 ARG2

或者 您还可以设置日志文件: 的valgrind --log- file = output.file --leak-check = yes --t OOL = MEMCHECK ./a.out ARG1 ARG2

output.file

+0

我做到了,但valgrind没有报告泄漏。 – 2013-05-02 07:29:06

+2

他已经使用了valgrind。 – scai 2013-05-02 07:29:24

0

如果Valgrind的不报告泄漏,不会有泄漏,您可以检查它的日志内存泄漏的错误... 猫无法访问的内存区域感(在您检查的运行过程中)。这并不意味着程序不会分配内存,使用它并在不再使用时释放内存(但它仍然可以访问)。考虑例如一个典型的待办事项堆栈,您将新项目置于顶部,在顶部处理该项目,然后再推送另一个项目。将永远不会回到旧的,所以用于他们的记忆被浪费了,但从技术上讲,这不是泄漏。

你可以做的是监视进程的内存使用情况。如果它稳步增加,那么可能在那里存在问题(无论是真正的泄漏还是一些不需要增长的数据结构)。

如果这不是真的迫切,从长远来看,它可能会更便宜,让它成为......

+0

我使用htop监视内存使用情况。过了一段时间,看起来这个特定过程(VIRT,RES,SHR)的所有记忆都稳定下来,并且不会进一步增长。你能更好地解释什么是监测? – 2013-05-02 19:22:35

+0

@BЈовић,如果内存使用量稳定下来,应该可以。 – vonbrand 2013-05-02 20:26:37