gpt4 book ai didi

c# - 如何在 clr.dll 中查看导致故障转储的 C# 代码?

转载 作者:太空宇宙 更新时间:2023-11-03 20:40:04 27 4
gpt4 key购买 nike

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

选择“混合调试”显然会导致 Visual Studio 无休止地滥用 CPU(我在大约 20 分钟后杀死了 devenv)。

当我“仅使用 native 进行调试”时,它找不到源代码(即使我已将源代码镜像到与测试机器相同的文件夹中)。它只是说:

Unhandled exception at 0x793f5b8c in YourWinApp.exe.hdmp: 0xC0000409: 0xc0000409.

然后给我看

Call stack location: clr.dll!793f5b8c()

我如何找出导致应用程序崩溃的原因?我可以在显示“通知 Microsoft”对话框时进行完整的故障转储吗?这会有帮助吗?

最佳答案

小型转储调试本应在 VS2010 中得到重大改进。我自己还没有看到很多证据,混合模式调试看起来和以前我做一些快速测试时一样尴尬。不要相信我的话。然而,纯 native 永远不会向您显示托管调用堆栈。

从源头上解决这个问题。为 AppDomain.CurrentDomain.UnhandledException 编写事件处理程序并将其注册到您的 Main() 方法中。让它在消息框中显示 e.ExceptionObject.ToString() 的值。这将为您提供异常的托管堆栈跟踪。当显示该消息框时,您还可以捕捉小型转储,应该让您更接近崩溃位置。

但是,您得到的特定异常肯定指向 native C/C++ 代码。正在破坏堆栈的缓冲区溢出。确保您拥有应用程序使用的任何 native 代码的 .pdb 文件。并设置 Microsoft 符号服务器,以便您从小型转储中获得良好的 native 堆栈跟踪。

编辑:您没有引发 UnhandledException 的事实肯定指向 CRT 中的堆栈完整性检查。它旨在引发异常但立即终止程序。必要的行为,因为堆栈被破坏,代码不能假设它可以安全地展开。鉴于崩溃位置,此检查很可能实际上是在 CLR 代码中完成的。我知道这在以前的 CLR 版本中没有完成,但在 .NET 4.0 中包含的 CLR 版本中可能有所不同

这将使获得托管堆栈跟踪变得相当困难。您可以从非托管堆栈跟踪中进行很多反向工程,只要您设置符号服务器以便从 CLR 堆栈帧中获取标识符名称即可。如果您需要帮助解释它,请在您的问题中发布该堆栈跟踪。顺便说一句,CLR 代码中的错误并非不可能,您可能需要考虑调用 Microsoft 支持部门。然而,他们将需要一致的重现。如果很难获得重现,他们可能会使用所有重要的堆栈跟踪。设置符号服务器以获得良好的非托管堆栈跟踪。在 VS2010 中很容易:工具 + 选项、调试、符号,勾选“Microsoft 符号服务器”。

关于c# - 如何在 clr.dll 中查看导致故障转储的 C# 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3319782/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com