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

Ben*_*enj 9 c++ windows heap windbg heap-memory

我工作的软件(用C++编写)目前存在堆损坏问题.我们的性能测试团队在登录到盒子的用户数量达到一定阈值时会不断出现WER错误,但是他们给我的转储只是显示了inoncent区域中的损坏(比如当std :: string释放它的底层内存时) .

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

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

cpr*_*mer 6

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

例如,您可以使用以下代码指定每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);
}
Run Code Online (Sandbox Code Playgroud)

  • 你会很高兴知道我最终找到了这个问题.我最终没有使用这种技术,尽管我很高兴知道它.在搞砸了我的产品配置之后,我发现了appverfier的问题,直到它如此极端以至于它出现在负载较少的情况下.我要标记这是接受的答案,因为它是app验证器唯一有趣的替代品. (2认同)