Ber*_*ann 1 c# clr memory-dump .net-4.0
我有一个Windows Forms应用程序(.NET 4),它在我的开发机器上运行良好但在其他两台测试机器上崩溃.我可以加载它在VS2010中创建的minidump.
选择"混合调试"导致Visual Studio滥用CPU显然无穷无尽(我在大约20分钟后杀死了devenv).
当我"仅使用Native进行调试"时,它找不到源(即使我已将源镜像到测试机器上的同一文件夹中).它简单地说:
YourWinApp .exe.hdmp中0x793f5b8c处的未处理异常 :0xC0000409:0xc0000409.
然后告诉我
调用堆栈位置:clr.dll!793f5b8c()
我如何找出导致应用程序崩溃的原因?在显示"通知Microsoft"对话框时,我可以采取完整的故障转储,这会有所帮助吗?
在VS2010中,Minidump调试应该会有很大改进.我自己还没有看到很多证据,混合模式调试看起来像我之前进行一些快速测试时一样尴尬.尽管如此,不要相信我的话.但是,Native-only永远不会向您显示托管调用堆栈.
在源头解决这个问题.为AppDomain.CurrentDomain.UnhandledException编写一个事件处理程序,并在Main()方法中注册它.让它在一个消息框中显示e.ExceptionObject.ToString()的值.这将获得异常的托管堆栈跟踪.显示该消息框时,您还可以捕捉minidump,应该让您更接近崩溃位置.
但是,您获得的特殊异常肯定是指向本机C/C++代码.缓冲区溢出正在破坏堆栈.确保您的应用使用的任何本机代码都有.pdb文件.并设置Microsoft符号服务器,以便从minidump获得良好的本机堆栈跟踪.
编辑:你没有得到UnhandledException的事实肯定指向CRT中的堆栈完整性检查.它旨在不引发异常但立即终止程序.必要的行为,因为堆栈被破坏,代码不能假设它可以安全解开.鉴于崩溃位置,这个检查可能实际上是在CLR代码中完成的.我知道在以前的CLR版本中没有这样做,但在.NET 4.0附带的CLR版本中可能会有所不同
这将使得获得托管堆栈跟踪变得非常困难.只要您设置符号服务器以便从CLR堆栈帧获取标识符名称,就可以从非托管堆栈跟踪中进行逆向工程.如果您需要帮助解释,请在您的问题中发布该堆栈跟踪.CLR代码中的错误不是不太可能btw,您可能需要考虑调用Microsoft支持.然而,他们需要一致的repro.如果很难找到repro,他们可能会使用所有重要的堆栈跟踪.设置符号服务器以获得良好的非托管堆栈跟踪.在VS2010中很容易:工具+选项,调试,符号,勾选"Microsoft Symbol Servers".