我有一套带有一系列单元测试的Win32 C ++应用程序。单元测试运行完毕后,我想要自动生成任何不同内存的人类可读报告。理想情况下,报告将包含文件和文件堆栈。每个未分配的分配的行号信息。以一致的顺序生成它们会很容易将它从一次运行扩展到下一次运行。 (基本上,我想要valgrind的结果--leak-check = full,但是在windows上)。
我已经成功地使用UMDH从运行流程中获取此类信息,但是如果您附加到现有流程,该工具似乎才有效。我希望每次运行单元测试时都会自动发生这种情况。
有没有可以做到这一点的工具?如果是这样,我该如何使用它?
谢谢!
答案 0 :(得分:4)
为了获得这种信息,我们覆盖new / delete和malloc / free,提供我们自己的堆实现,它们在分配时存储堆栈跟踪并在堆被销毁时生成报告(以及添加标记来检测缓冲区溢出)
第一次这样做时,这是一项相当多的工作。 This guy编写了一个免费软件工具来处理所有的硬件 - 我自己没有尝试过,但是他自己编写代码时的解释是有用的。
答案 1 :(得分:1)
如果您正在使用MSVC,Microsoft的Debug堆函数可用于生成您想要的报告,但它可能不是您想要的自动(您可能需要编写一些自定义代码):
_CrtSetReportMode
_CrtSetReportFile
_CrtMemState
_CrtMemCheckpoint
_CrtMemDumpStatistics
_CrtSetReportFile
_CrtSetDbgFlag
答案 2 :(得分:0)
您可以定义DEBUG_NEW并启用一些泄漏检测,您需要在包含任何系统包含文件之前对其进行定义。它只使用new运算符检查泄漏,当然你必须重新编译代码,这样就不能像valgrind那样附加它。
在此处查看更多信息:
http://msdn.microsoft.com/en-us/library/tz7sxz99(VS.80).aspx
答案 3 :(得分:0)
我曾经做过一次,但它并不是那么自动化。我现在无法访问该代码,但这是一个想法:
我使用了Mike B提到的debug functions(顺便说一句,他们只在Debug中工作)。
测试运行器运行所有测试两次,因为在第一次运行期间,内存被分配给全局变量。第二次,在每次测试之前和之后检查已分配块的总数(我认为你可以在setUp()和tearDown()中完成。如果数字不同,则表示内存泄漏,测试失败并显示相应的消息。当然,如果测试本身失败,您应该保留其错误消息。现在要查找泄漏,我必须使用pBlockHeader读取最后一次分配的块分配编号,然后使用_CrtSetBreakAlloc在其上设置断点并再次运行。
有关此内容的更多信息:http://levsblog.wordpress.com/2008/10/31/unit-testing-memory-leaks/
答案 4 :(得分:0)
我使用了Mike B指出的CRT Debug Heap函数,但最终我还不满足于获取泄漏内存的地址。获得像UMDH这样的堆栈可以使调试速度更快。所以,现在我的main()函数中 在我运行测试以获取堆快照之前和之后使用CreateProcess启动UMDH。我还写了一个简单的批处理文件,它运行我的测试工具,然后区分堆快照。因此,我启动批处理文件并获取我的测试结果和一个文本文件,其中包含所有未完成分配的完整堆栈。
UMDH收集了很多误报,所以也许CrtDebug的一些混合物以及我现在正在做的事情将是一个更好的解决方案。但就目前而言,我对自己拥有的东西感到满意。
现在,如果我有办法检测我是否没有关闭任何句柄......