Windows环境下C++应用程序崩溃检测 我的C++ MFC应用程序之一在一些WEXOWS7、XP计算机上随机崩溃。这个应用程序使用一些第三方库ApacheAxis,当我使用dependency walker检查时,它会在加载与这个第三方库相关的DLL后显示应用程序退出

Windows环境下C++应用程序崩溃检测 我的C++ MFC应用程序之一在一些WEXOWS7、XP计算机上随机崩溃。这个应用程序使用一些第三方库ApacheAxis,当我使用dependency walker检查时,它会在加载与这个第三方库相关的DLL后显示应用程序退出,c++,windows,C++,Windows,所以我需要一种方法来检测这个应用程序崩溃的原因。有没有办法做到这一点 我读到它可以使用.pdb文件与.exe文件一起托管来识别崩溃问题,但与往常一样,微软没有明确的文档说明如何使用。 我尝试使用IBM purify试用版。但是我没有显示任何有效的信息。 我试着用WinDbg。但是我找不到如何使用它。 任何帮助都非常感谢 编辑:添加了崩溃报告 Problem Event Name: APPCRASH Application Name:

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

我读到它可以使用.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`

下面是您可以采取的一些步骤,以尝试找到问题的根源

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

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

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

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

因为这似乎是您第一次接触到使用调试器,所以请为一些挫折做好准备。这很正常

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

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

。 . .

更改解决方案设置的检查

打开控制面板 打开行动中心 单击“更改操作中心设置” 单击问题报告设置 选择每次出现问题时,请在检查解决方案之前询问我。
你可以考虑得到一个拷贝,这是一个设计来处理这种情况的工具。您还可以考虑将客户端设置为WiTebug,以捕获它们最初使用的导致问题的步骤。这大大简化了复制和消除过程

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


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

关于pdb文件和windbg以及其他调试器的信息有很多—您可以从这里开始—崩溃的Windows机器是32位的,工作的是64位的吗?一个
更多链接-@fatih_k:这是一个32位构建应用程序。在32位计算机上进行测试,人们对此投了反对票,因为这个问题涉及面很广,没有显示出研究成果。更好的方法是尝试使用PDB、windbg等,并说出您面临的具体问题。感谢您的指导。实际上,前几天我试着用上面的方法得到崩溃点。但到目前为止我还没有成功。在这里,我在问题中添加了碰撞报告。在我在文本字段中键入崩溃地址后的第6点,它显示找不到地址。那么我做的方式有什么问题吗?