我有一个Windows窗体应用程序(.NET 4)在我的开发机上运行罚款,但在另外两个测试机器上崩溃。我可以加载它在VS2010中创建的miniDump。

选择“使用混合的调试”导致显然无限(我在大约20分钟后杀死Devenv)通过Visual Studio滥用CPU。

当我“仅使用本机制”时,它找不到源(即使我已将源镜像在与测试机器上的同一文件夹中)。它简单地说:

0x793f5b8c的未处理异常 yourwinapp .exe.hdmp:0xc0000409:0xC0000409。

然后显示我

呼叫堆栈位置:clr.dll!793f5b8c()

如何了解导致应用程序崩溃的内容?我可以拿一个完整的crashdump,而是显示“通知Microsoft”对话框,这会有所帮助吗?

有帮助吗?

解决方案

MiniDump调试应该在VS2010中大大改善。我自己没有看到很多证据,混合模式调试看起来像在我做一些快速测试之前一样尴尬。虽然不要拿到我的话。然而,唯一的是永远不会向您展示托管呼叫堆栈。

在源处解决这个问题。为AppDomain.CurrentDomain.UnHandleDException编写一个事件处理程序并在您的main()方法中注册它。让它显示e.exceptionobject.tostring()的值,例如,消息框。这使您成为异常的托管堆栈跟踪。虽然显示该消息框,但您也可以捕捉MiniDump,应该让您更接近崩溃位置。

您所处的特定异常肯定指向本机C / C ++代码。损坏堆栈的缓冲区溢出。确保您拥有应用程序使用的任何本机代码的.pdb文件。并设置Microsoft符号服务器,以便从MiniDump获取一个良好的本机堆栈跟踪。

编辑:您没有unhandledException的事实呈现肯定指向CRT中的堆栈完整性检查。它旨在 not 提出异常,但立即终止该计划。必要的行为,因为堆栈受到损害,代码不能假设它可以安全地解除。鉴于崩溃位置,此检查可能实际上在CLR代码中完成。我知道这不是在以前的CLR版本中完成的,但在.NET 4.0

中包含的CLR版本中可能是不同的。

这将使托管堆栈跟踪很难。只要您设置符号服务器,您可以从非托管堆栈跟踪开始重新启动工程师,从而从CLR堆栈帧获取标识符名称。如果您想要帮助解释它,请在您的问题中发布堆栈跟踪。 CLR代码中的错误不太可能BTW,您可能希望考虑调用Microsoft支持。然而,他们将需要一致的畜牧。如果恢复难以通过,他们可能会与所有重要的堆栈跟踪做成。设置符号服务器以获取一个良好的非托管堆栈跟踪。 VS2010轻松:工具+选项,调试,符号,勾选“Microsoft Symbol服务器”。

其他提示

您配置 procdump 获取完整内存转储如果应用程序有未处理的异常,您可以在VS或WindBG中调试它

和minidump将呼叫堆栈信息作为watson存储桶,这里是 clr 团队和我写了关于同一个

对未处理异常的事件查看器中看到的Watson Bucket信息的简要说明

  1. execilename
  2. exe装配版本
  3. EXE组装时间戳
  4. 全名
  5. 故障组装版本
  6. 故障组装时间戳
  7. 故障组装方法def
  8. 导致异常的错误方法IL指令
  9. 异常类型
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top