我工作的软件(用 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/