如何看到C#代码导致CLR.dll中的CrashDump?
-
28-09-2020 - |
题
我有一个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服务器”。