Minidump 调试应该在 VS2010 中得到重大改进。我自己还没有看到很多证据,当我做一些快速测试时,混合模式调试看起来和以前一样尴尬。不过,不要相信我的话。然而,仅本机永远不会向您显示托管调用堆栈。
从源头上解决这个问题。为 AppDomain.CurrentDomain.UnhandledException 编写一个事件处理程序并将其注册到您的 Main() 方法中。让它在一个消息框中显示 e.ExceptionObject.ToString() 的值。这将为您提供异常的托管堆栈跟踪。当显示该消息框时,您还可以捕捉小型转储,应该让您更接近崩溃位置。
但是,您得到的特定异常肯定是指向本机 C/C++ 代码。破坏堆栈的缓冲区溢出。确保您拥有应用程序使用的任何本机代码的 .pdb 文件。并设置 Microsoft 符号服务器,以便您从小型转储中获得良好的本机堆栈跟踪。
编辑:你没有得到 UnhandledException 的事实肯定指向 CRT 中的堆栈完整性检查。它旨在不引发异常而是立即终止程序。必要的行为,因为堆栈被破坏,代码不能假设它可以安全地展开。给定崩溃位置,该检查很可能实际上是在 CLR 代码中完成的。我知道这在以前的 CLR 版本中没有完成,但在 .NET 4.0 中包含的 CLR 版本中可能会有所不同
这将使获取托管堆栈跟踪变得非常困难。只要您设置符号服务器以便从 CLR 堆栈帧中获取标识符名称,您就可以从非托管堆栈跟踪中进行逆向工程。如果您需要帮助解释它,请在您的问题中发布该堆栈跟踪。顺便说一句,CLR 代码中的错误并非不可能,您可能需要考虑致电 Microsoft 支持。然而,他们将需要一致的复制。如果难以获得重现,他们可能会使用所有重要的堆栈跟踪。设置符号服务器以获得良好的非托管堆栈跟踪。在 VS2010 中很简单:工具 + 选项、调试、符号,勾选“Microsoft 符号服务器”。