内存泄漏单元测试 C++
Posted
技术标签:
【中文标题】内存泄漏单元测试 C++【英文标题】:memory leak unit test c++ 【发布时间】:2010-08-24 18:49:04 【问题描述】:我刚刚解决了我的应用程序中的内存泄漏问题,现在我想编写一个单元测试以确保这种情况不会再次发生。
我正在寻找一种方法来检测当前应用程序(工作集)在某些功能之前和之后的内存使用情况。
例如:
long mem_used= GetMemUsed();
/* Do some work */
/* clean up */
if( mem_used != GetMemUsed() )
Error( "Memory leek" );
我找到了很多方法来检测整个系统的内存使用情况,但没有一种方法仅适用于当前应用程序。
建议、链接、代码 sn-ps?
【问题讨论】:
在修复错误之前编写单元测试。 这里的平台/编译器是什么? @Steve Townsend - VS2008 Windows,哎呀忘了提。 【参考方案1】:Boost.Test 会在测试运行结束时自动告诉您是否有任何单元测试泄漏内存。
我不知道其他 C++ 单元测试框架是否提供这种功能。
【讨论】:
仅在 MS 编译器上支持内存泄漏:boost.org/doc/libs/1_44_0/libs/test/doc/html/execution-monitor/…【参考方案2】:我真的很喜欢ValGrind 这种事情。这些工具已经存在;您无需编写自己的单元测试来检测内存泄漏。
【讨论】:
只要确保它被内置到单元测试中。必须手动运行 valgrind 来验证应用程序会导致懒惰的人不运行测试。 这听起来像是人事问题,而不是软件问题。 @Ed:懒惰是一个人的问题,我们同意,但既然你已经被预先警告过,请考虑到它,并且正如 Martin 建议的那样,让它更容易运行测试的方法也是建立内存泄漏检测的那个:) 好的,构建后自动启动它怎么样?这应该不难,我们在每次构建核心输入/输出模块后都会启动许多单独的测试实用程序。 @EdS.,我称之为资源使用问题。每个项目只有这么多的开发时间和注意力。如果您将开发人员的时间花费在手动运行测试上,那么效率会很低,并且会占用资源来添加功能和修复错误...【参考方案3】:对于使用 GLibC 的 Linux 或其他系统,有 functions 来获取内存分配统计信息。假设没有惰性分配,您应该在执行测试之前和之后将相同的内存提交给 malloc。
【讨论】:
OP 在询问 C++。 malloc 不应在 C++ 上下文中使用。 @Michael,从程序员的角度来看确实如此,但您可能会发现 C++ 标准库定义了new
以在后台使用 malloc。 Malloc 统计数据可能仍然与泄漏检测相关。
可能吗?在我假设任何事情之前,我想确定一下。
@anthropomorphic new 的实现依赖于平台。由于全局 new 运算符可能只是标头,因此您可以检查平台 SDK 中的代码。如果没有,您将不得不浏览源代码或参考相关的平台 SDK 文档。【参考方案4】:
这不是单元测试。如果您想确保应该管理资源的某个单元不会泄漏该资源,那么您需要验证它正在管理的资源是否在正确的时间被删除。您可以使用模拟对象来执行此操作,这些对象在构造时增加计数器并在删除时减少……然后确保计数正确。
检查整个应用程序的内存使用情况的测试不适用于单元测试。单元测试适用于应用程序中的特定单元。
【讨论】:
“那不是单元测试”中的“那”是什么?运行 ValGrind?感谢计数模拟对象的建议!【参考方案5】:您还可以使用 google 测试框架 (gtest
),然后使用 google 性能工具 (gperf
) 查找漏洞。 GPerf 放入一个替换内存库,如果在测试运行完成后发现内存泄漏,它会通知您并为您提供 pprof 命令以使用几种不同的输出格式运行 - 文本、点、Web 等。此工具将查找测试和生产代码中的漏洞。
我还使用Valgrind
来确认是否存在泄漏,但我更喜欢gperf
。一个问题是,如果您使用gperf
内存库编译并尝试使用Valgrind
,它不会发现任何问题,因为它会捕获泄漏,因此您需要在切换之间清理编译或拥有第二个副本项目。
【讨论】:
【参考方案6】:ProcessExplorer (http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx) 非常适合。
【讨论】:
我一直在使用这个工具,但是这种方式是手动过程。我正在寻找一种在代码中执行此操作的方法,以便可以将其添加到单元测试中。以上是关于内存泄漏单元测试 C++的主要内容,如果未能解决你的问题,请参考以下文章