【问题标题】:C++ application crash detect on windowsWindows上的C ++应用程序崩溃检测
【发布时间】:2013-05-31 05:04:02
【问题描述】:

我的一个 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`

【问题讨论】:

标签: c++ windows


【解决方案1】:

您可以采取以下几个步骤来尝试找出问题的根源。

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

从这里开始,您将不得不根据您对应用程序和第三方库的知识和经验来实现它。在预计发生崩溃的位置放置一个断点。每当断点被击中时,请查看调用堆栈以查看调用的来源。问题可能出在您的代码第三方库(但可能是您的代码)中。

您应该努力重现崩溃。让用户记录崩溃发生时他们正在执行的操作。还让它们包含应用程序或库生成的任何日志。

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

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

由于这似乎是您第一次接触调试器,因此请做好准备应对一些挫折。这很正常。

*其中一些步骤假设您使用的是 Visual Studio。 WinDbg的界面不同,但概念是一样的。

**这些步骤也假设是 Windows 7。当应用程序崩溃并且不需要重新配置时,Windows XP 会显示一个包含类似信息的窗口。

。 .
.

更改解决方案设置检查

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

【讨论】:

  • 感谢您的指导。实际上,最近几天我尝试使用上述方法获取崩溃点。但到目前为止我还没有成功。在这里,我在我的问题中添加了崩溃报告。在我在文本字段中输入崩溃地址后,在您的第 6 点中,它说找不到地址。那么我的做法有什么问题吗?
【解决方案2】:

您可以考虑获取一份AQtrace 的副本,该工具旨在处理这种确切情况。您还可以考虑使用an automation tool 设置您的客户端,例如WinTask,首先捕获他们用来导致问题的步骤。这大大简化了复制和消除它。

【讨论】:

    【解决方案3】:

    CrashRpt 是我们用于 MFC 应用程序的优秀开源工具。用户可以在发生崩溃后看到 CrashSender 窗口,然后他可以发送包含可以在 MS Visual Studio 中打开的 minidump 文件的崩溃报告。当然,在 VS 中运行故障转储时,您需要为特定构建保留二进制文件和相应的 .pdb 文件以获得正确的调用堆栈。

    第三方软件中也会发生一些崩溃。我们能够将此类情况通知客户。

    【讨论】:

      猜你喜欢
      • 2016-10-06
      • 2013-04-11
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多