【问题标题】:Using CppUnit for memory leak detection使用 CppUnit 进行内存泄漏检测
【发布时间】:2010-11-03 08:09:53
【问题描述】:

是否有人知道 CppUnit 的扩展可用于在逐个测试的基础上做出有关内存泄漏的断言。

即CPPUNIT_ASSERT_NO_LEAKS()?

本质上,我希望能够在执行测试导致内存泄漏时使特定测试失败。

【问题讨论】:

    标签: c++ unit-testing memory-leaks cppunit


    【解决方案1】:

    我知道现在回答这个问题有点太晚了。但这是来自 Microsoft 的一个很棒的工具。我现在是 linux 用户,但我在 windows 中编写代码时使用过它(Visual C++ 和 Qt) http://www.microsoft.com/en-us/download/details.aspx?id=20028

    【讨论】:

      【解决方案2】:

      在我工作的地方,我们使用 purify 构建单元测试。然后我们的持续集成平台提取成功/失败的测试用例数量和泄漏字节数(+ lint 和覆盖结果),并将其显示在网页上。我强烈推荐这样做。

      很抱歉没有提供您想要的解决方案。

      【讨论】:

        【解决方案3】:

        我知道它不是 CppUnit,但是 boost::test 可以做内存泄漏检测。

        来自http://www.boost.org/doc/libs/1_39_0/libs/test/doc/html/execution-monitor/user-guide.html

        void detect_memory_leaks( bool on_off );

        void break_memory_alloc( long mem_alloc_order_num );

        【讨论】:

        • 链接页面中的这篇文章应该注意:“不幸的是,目前该功能仅适用于 Microsoft 系列编译器(以及 Intel,如果它使用 Microsoft C 运行时库)。另外它不能针对监视器的每个实例进行调整,并且仅在全局触发并在整个程序执行完成后报告。将来应该改进。”
        【解决方案4】:

        如果您在 Linux 上运行,则可以使用 memcheck 运行测试。

        手册的Client Requests 部分描述了几个有用的宏,其中一个被标记为对测试有用:

        VALGRIND_COUNT_LEAKS:在四个参数中填充上一次泄漏检查发现的被泄漏、可疑、可达和抑制的内存字节数。同样,在调用 VALGRIND_DO_LEAK_CHECK 之后,在测试工具代码中很有用。

        宏在memcheck.h 中定义(可能在/usr/include/valgrind 中),您想要的序列将类似于

        unsigned long base_definite, base_dubious, base_reachable, base_suppressed;
        VALGRIND_DO_LEAK_CHECK;
        VALGRIND_COUNT_LEAKS(base_definite, base_dubious, base_reachable, base_suppressed);
        // maybe assert that they're zero!
        
        // call test
        
        unsigned long leaked, dubious, reachable, suppressed;
        VALGRIND_DO_LEAK_CHECK;
        VALGRIND_COUNT_LEAKS(leaked, dubious, reachable, suppressed);
        CPPUNIT_ASSERT_EQUAL(base_leaked, leaked);
        // etc.
        

        对每个测试重复这一点会很痛苦,因此您可以编写自己的宏,或者更好的是专门的TestRunner

        【讨论】:

          【解决方案5】:

          在 Windows 上,使用一些对调试堆的调用来让 CppUnit 使用 _CrtMemCheckpoint()_CrtMemDifference() 处理此信息是一件非常简单的事情:

          有缺点:

          • 您必须在测试开始时手动放置一些东西才能获得检查点(也许有办法以某种方式将其集成到 CppUnit 中)
          • 仅适用于 Windows(在其他各种平台上可能有类似的东西)
          • 它仅适用于使用 Debug CRT 的构建

          【讨论】:

            【解决方案6】:

            使用valgrind 运行您的单元测试。我使用的单元测试框架允许您运行一个或多个单独的单元测试,这样您就可以检测出哪个导致了泄漏。

            【讨论】:

              【解决方案7】:

              CPPUNIT 默认不支持内存泄漏检查。

              该项目现在已经重新开始了(已经停止了很长时间),这可能是CPPUNIT2的一个特性,您可以向作者提出(或写信)。

              如果您正在寻找支持内存泄漏检测的单元测试框架,您可以尝试查看CppUTest。这是 Martin Fowler 和 Bob Martin 在一些 TDD 课程中使用的项目。挺好的。

              【讨论】:

              • CppUTest 是我以前从未见过的……谢谢!看起来那里对内存测试有一些基本的支持。现在查看 CppUnit 2 文档...
              【解决方案8】:

              不知道,但您可以使用 Fluid Studios 内存管理器代码之类的东西,并通过一些调整将其挂钩。或者将其编译到您的测试应用程序中,然后有一个脚本为每个测试运行一次应用程序并整理内存跟踪结果。

              【讨论】:

                猜你喜欢
                • 2012-10-29
                • 2011-11-23
                • 2012-07-16
                • 2010-12-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多