我问这个问题,因为我们真的很难找到导致软件崩溃的原因。我知道类似的问题"为什么软件崩溃"不赞赏,但我们真的不知道如何找到问题。
我们目前正在对我们的软件进行长期测试。为了发现潜在的内存泄漏,我们使用Windows工具性能监视器来跟踪多个内存指标,例如专用字节,工作集和虚拟字节。
该软件运行了很长时间(约30小时),没有任何问题。它一直都是这样,从硬盘读取图像,进行一些检查并显示一些结果。
然后它突然崩溃了。检查性能监视器中的内存指标,我们在10.17AM看到了工作集字节图的奇怪的急剧上升。我们遇到过这几次,根据dumpfiles,异常代码总是 0xc0000005:&#34;线程试图读取或写入一个没有相应访问权限的虚拟地址&#34; < / em>,但它出现在不同的位置,没有使用指针。
有人知道,工作集如此急剧上升的原因是什么?为什么会导致软件崩溃?我们怎么能发现,如果我们的软件有错误,每次发生崩溃时,崩溃的位置都在另一个位置?
该应用程序是用C ++编写的,它运行在Windows 7 32位PC上。
答案 0 :(得分:1)
实际上不可能从您提供的信息中知道,但我建议您有一些内存损坏(因此访问冲突)。它可能是缓冲区溢出问题...例如,字符串中缺少null
字符,因此无限期地附加了某些内容?
建议下一步是下载Windows套件调试工具。使用正确的符号文件设置WinDbg
,并分析堆栈跟踪,以查找崩溃的一般区域。根据内存损坏的原因,这或多或少都有用。在崩溃发生之前很长一段时间你可能已经破坏了内存。
理想情况下,还要在代码上运行静态分析工具。
答案 1 :(得分:1)
鉴于您现在掌握的信息,几乎没有机会得到答案。您需要更多信息,更具体地说:
获取更多情报(是否有任何关于导致崩溃的文件的具体内容?最后一个文件怎么样?)
插入更多跟踪和日志记录(尽可能多地使用2x的速度)。至少你会看到它崩溃的地方,然后能够在那个地方插入更多的追踪/记录
正如您在Windows上一样 - 考虑通过_set_se_translator处理c0000005,将其转换为C ++异常,甚至更多地记录此异常的解除方式。
这类问题没有灵丹妙药,只收集更多信息并搞清楚。
P.S。作为一个不太可能的镜头 - 我已经看到类似的事情是由MS堆中的错误引起的;如果你还没有使用LFH(不确定,它现在可能是默认的) - 有1%的几率将默认堆更改为LFH会有所帮助。