在Windows上的C ++应用程序崩溃检测

我的一个C ++ MFC应用程序随机在一些Windows(7,xp)计算机上崩溃。 这个应用程序使用一些第三方库(Apache轴),当我检查与依赖沃克它显示加载与第三方库有关的DLL后退出应用程序。

所以我需要一种方法来检测这个应用程序的崩溃原因是什么。 有没有办法做到这一点?

  • 我读过它可以使用.pdb文件与.exe文件一起宿主识别崩溃问题,但像往常一样,微软没有明确的文件如何使用。
  • 我尝试使用IBM purify试用版。 但是我没有显示任何有效的信息。
  • 我试图使用WinDbg 。 但我找不到如何使用它。

任何协助真的很感激。

编辑:崩溃报告添加

 Problem Event Name: APPCRASH Application Name: installer.exe Application Version: 5.0.1.0 Application Timestamp: 51ac0bdc Fault Module Name: AxisXMLParserXerces.dll Fault Module Version: 1.0.0.0 Fault Module Timestamp: 51ac0016 Exception Code: c0000005 Exception Offset: 0000161d OS Version: 6.1.7601.2.1.0.256.4 Locale ID: 18441 Additional Information 1: 0a9e Additional Information 2: 0a9e372d3b4ad19135b953a78882e789 Additional Information 3: 0a9e Additional Information 4: 0a9e372d3b4ad19135b953a78882e789` 

以下是您可以尝试查找问题来源的几个步骤。

  1. 构建应用程序的发行版本。 确保生成PDB文件已启用。
  2. 发送给客户。 确保他们改变了“检查解决方案”设置(见下文)。
  3. 当它崩溃时,他们应该选择“显示程序详细信息”
  4. 让他们记录“故障模块名称”,“故障执行代码”和“故障执行偏移”
  5. 开始发送完全相同的版本。 可执行文件和PDB文件应该位于它们最初保存到的目录中。 (例如solution \ project \ Release)。 我建议在发送文件之前,先把它们压缩到整个“发布”目录,然后保存到某个地方。 这样,如果您意外地执行了更改文件的清理或其他操作,则您将拥有完全相同的副本。
  6. 在Visual Studio中用调试器附加到进程。 (在“调试”菜单中)
  7. 打破应用程序的执行。 (再次,在“调试”菜单中)
  8. 打开反汇编窗口。 (再次,在“调试”菜单中)
  9. 在反汇编窗口顶部的“地址”输入行中,根据模块当前的加载地址和崩溃报告提供的“执行偏移量”输入崩溃地址。 如果模块加载,则需要修改应用程序以在启动时强制加载(这将需要您发送新版本并从第1步开始)。 请确保您检查错误,因为崩溃可能是DLL加载失败的结果。

从这里你将不得不根据你的知识和经验与你的应用程序和第三方库。 在预计发生崩溃的地方放置一个断点。 任何时候点击断点看看调用堆栈,看看来电的来源。 问题可能出现在您的代码第三方库(但可能是您的代码)。

你应该努力重现崩溃。 让用户记录发生事故时他们正在执行的操作。 也有他们包括应用程序或库生成的任何日志。

这将增加您找出问题的机会,但正如我上面所述,您将需要依靠您对应用程序和库的了解。

我建议在开始之前,向应用程序添加一些代码来强制执行崩溃,并自行完成这些步骤,以便熟悉它们。 可能需要一些尝试,然后才能正确完成,您可能需要稍微调整步骤,并根据您的环境和应用程序进行调整。 请记住在将它发送给用户之前删除这个崩溃代码。

因为这似乎是你第一次使用调试器准备一些挫折。 这是正常的。

* 其中一些步骤假定您正在使用Visual Studio。 WinDbg具有不同的界面,但概念是相同的。

** 这些步骤也承担Windows 7. Windows XP显示一个窗口,其中包含应用程序崩溃时不需要重新配置的类似信息。

。 。

更改检查解决方案设置

  1. 打开控制面板
  2. 打开行动中心
  3. 点击“”更改操作中心设置“
  4. 点击“问题报告设置”
  5. 选择“每次发生问题时,在检查解决方案之前询问我。

你可以考虑得到一个AQtrace的副本,这是一个工具,旨在处理这个确切的情况。 您也可以考虑使用自动化工具 (例如WinTask)来设置客户端,以捕获他们用来解决问题的步骤。 这大大简化了复制和消除它。

CrashRpt是我们用于MFC应用程序的一个很好的开源工具。 用户可以在发生崩溃后看到CrashSender窗口,然后发送包含可在MS Visual Studio中打开的小型转储文件的崩溃报告。 当然,你需要保留你的二进制文件和相应的.pdb文件,以便在VS中运行崩溃转储时获得正确的调用堆栈。

第三方软件也发生了一些崩溃事件。 我们能够通知客户这种情况。