c++ - 查找仅在性能测试下发生的堆损坏的最佳方法是什么?

标签 c++ windows heap-memory windbg

我工作的软件(用 C++ 编写)目前存在堆损坏问题。当登录到该框的用户数量达到某个阈值时,我们的 perf 测试团队不断遇到 WER 错误,但他们给我的转储只显示无辜区域的损坏(例如,当 std::string 释放它的底层内存时) .

我尝试过使用 Appverifier,这确实引发了一些我现在已经解决的问题。然而,我现在的情况是,测试人员可以使用 Appverifier 尽可能多地加载机器并进行干净的运行,但在没有 Appverifier 的情况下运行时仍然会出现堆损坏(我猜是因为他们可以在没有 Appverifier 的情况下获得更多用户等)。这意味着我无法获得实际显示问题的转储。

有没有人对我可以使用的有用技巧或技术有任何其他想法?我在没有 appverifier 的情况下对堆损坏转储进行了尽可能多的分析,但我看不到任何共同的主题。没有线程在崩溃的同时做任何有趣的事情,崩溃的线程是无辜的,这让我认为损坏发生在一段时间之前。

最佳答案

最好的工具是结合 gFlags 的 Appverifier,但还有许多其他解决方案可能会有所帮助。

例如,您可以使用以下代码指定每 16 次 malloc、realloc、free 和 _msize 操作进行一次堆检查:

#include <crtdbg.h>
int main( )
{
int tmp;

// Get the current bits
tmp = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);

// Clear the upper 16 bits and OR in the desired freqency
tmp = (tmp & 0x0000FFFF) | _CRTDBG_CHECK_EVERY_16_DF;

// Set the new bits
_CrtSetDbgFlag(tmp);
}

关于c++ - 查找仅在性能测试下发生的堆损坏的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6941315/

相关文章:

c++ - 使用匿名 mmap() 检查实际分配的页面数

c++ - 如何在 Windows 上编译 OpenSSL?

windows - 如何将 DOS/Windows 换行符 (CRLF) 转换为 Unix 换行符 (LF)

堆上的 C++ 多维数组

c++ - Qt Creator 构建项目 - 没有这样的文件或目录

c++ - STL 中的返回函数

c++ - 为什么 C++ 字符串不需要 std::forward 来调用所需的函数?

windows - 如何更改 nsis 快捷方式路径的开始?

java - 如何计算 GC 工作所需的 oldGen 的大小?

ios - Swift 栈和堆的理解