【问题标题】:How can a regression test prove whether VirtualAlloc was called?回归测试如何证明是否调用了 VirtualAlloc?
【发布时间】:2015-07-29 21:17:07
【问题描述】:

我正在为正在优化的 (Win7) C++ 例程编写回归测试,该例程以前释放并重新分配了许多巨大的缓冲区:内存流失。我想证明,在测试期间,程序不会分配任何大内存区域(比如 16M 或更大),而是有效地重新使用在初始化时分配的内存。归根结底,如果调用 VirtualAlloc 以获取一些大区域(例如 16M),则测试应该失败。

有没有一种优雅的方法来统计对 Windows VirtualAlloc 的调用的统计信息?这将成为永久自动回归测试套件的一部分,因此使用外部工具或修改下游代码是不可行的。

检查提交的总内存不太合适,因为我想断言例程不再搅动(释放和重新分配缓冲区。)

【问题讨论】:

  • 写一个包装函数?

标签: c++ windows unit-testing heap-profiling


【解决方案1】:

挂钩

Detours 可以挂钩任意方法调用,但是

  • 仅供非商业用途免费使用
  • 对于单元测试来说可能有点过分了

RohitabEasyhook 似乎提供了类似的东西。

替代方案

如果您的进程是 32 位的,您可以提前分配 4080 MB(或多或少),对 VirtualAlloc 的更多调用将失败。这不包括您多次分配/取消分配 16 MB 的情况。如果您保留这些 4080 MB,这甚至会很快,因为不需要实际内存。

【讨论】:

  • 我使用 Rohitab 演示,成功统计了可执行文件中的所有 VirtualAlloc 调用,但没有统计到 DLL 的几个 API 层下的调用。
【解决方案2】:

依赖注入。

不是让被测代码调用本机内存分配器,而是传递一个指向代码可以使用的分配器对象的指针。对于生产代码,此分配器对象仅调用本机内存分配函数。对于测试,您传入一个分配器来检查和/或记录大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多