在流程急剧上升后软件崩溃'工作集记忆

时间:2015-06-03 09:53:10

标签: c++ crash crash-dumps perfmon

我问这个问题,因为我们真的很难找到导致软件崩溃的原因。我知道类似的问题"为什么软件崩溃"不赞赏,但我们真的不知道如何找到问题。

我们目前正在对我们的软件进行长期测试。为了发现潜在的内存泄漏,我们使用Windows工具性能监视器来跟踪多个内存指标,例如专用字节工作集虚拟字节

该软件运行了很长时间(约30小时),没有任何问题。它一直都是这样,从硬盘读取图像,进行一些检查并显示一些结果。

然后它突然崩溃了。检查性能监视器中的内存指标,我们在10.17AM看到了工作集字节图的奇怪的急剧上升。我们遇到过这几次,根据dumpfiles,异常代码总是 0xc0000005:&#34;线程试图读取或写入一个没有相应访问权限的虚拟地址&#34; < / em>,但它出现在不同的位置,没有使用指针。

有人知道,工作集如此急剧上升的原因是什么?为什么会导致软件崩溃?我们怎么能发现,如果我们的软件有错误,每次发生崩溃时,崩溃的位置都在另一个位置?

该应用程序是用C ++编写的,它运行在Windows 7 32位PC上。

Crash happens after the rise of the working set memory

2 个答案:

答案 0 :(得分:1)

实际上不可能从您提供的信息中知道,但我建议您有一些内存损坏(因此访问冲突)。它可能是缓冲区溢出问题...例如,字符串中缺少null字符,因此无限期地附加了某些内容?

建议下一步是下载Windows套件调试工具。使用正确的符号文件设置WinDbg,并分析堆栈跟踪,以查找崩溃的一般区域。根据内存损坏的原因,这或多或少都有用。在崩溃发生之前很长一段时间你可能已经破坏了内存。

理想情况下,还要在代码上运行静态分析工具。

答案 1 :(得分:1)

鉴于您现在掌握的信息,几乎没有机会得到答案。您需要更多信息,更具体地说:

  1. 获取更多情报(是否有任何关于导致崩溃的文件的具体内容?最后一个文件怎么样?)

  2. 插入更多跟踪和日志记录(尽可能多地使用2x的速度)。至少你会看到它崩溃的地方,然后能够在那个地方插入更多的追踪/记录

  3. 正如您在Windows上一样 - 考虑通过_set_se_translator处理c0000005,将其转换为C ++异常,甚至更多地记录此异常的解除方式。

  4. 这类问题没有灵丹妙药,只收集更多信息并搞清楚。

    P.S。作为一个不太可能的镜头 - 我已经看到类似的事情是由MS堆中的错误引起的;如果你还没有使用LFH(不确定,它现在可能是默认的) - 有1%的几率将默认堆更改为LFH会有所帮助。