调试诊断在 .NET 4 下不显示 .NET 堆栈信息

本文关键字:NET 显示 堆栈 信息 诊断 调试 | 更新日期: 2023-09-27 17:56:28

感觉这个问题可能有一个简单的答案,但我无法找到它。

有问题的方案是 C# .NET 控制台应用。

我通常使用 DebugDiag 1.2 来检查来自我们遇到的挂起.dmp文件——通常是线程锁定问题。 它们是使用 DebugDiag 的"创建完整用户转储"选项创建的。

我最近开始编译面向 .NET 4 的应用程序,为开始使用 .NET 4 的某些功能做准备。 但是,我注意到在使用 DebugDiag 分析这些.dmp文件时,所有 .NET 堆栈信息都丢失了。

如果我将 CLR 目标更改回 .NET 3.5,并从新的可执行文件中捕获.dmp,则 .NET 调用堆栈信息就在那里。

当我查看 DebugDiag 的输出时,我看到一个注释说:

CLR 信息

CLR 版本 = 4.0.30319.17929 CLR 调试器扩展 = C:''Program Files''DebugDiag''Exts''psscor4.dll

.NET 线程摘要

无法请求线程存储

我认为"未能请求线程存储"是问题的关键,因为 .NET 3.5 .DMP 文件(使用 psscor2.dll)报告"线程摘要"标题下的所有线程信息。

问题是.dmp缺少信息,或者 DebugDiag 由于某种原因无法检索它?

调试诊断在 .NET 4 下不显示 .NET 堆栈信息

最终,这个解决了自己。 我向Microsoft发送了一个问题,他们说DebugDiag 1.1不支持.NET 4+。 他们不久前发布了 v1.2,它确实 - 再次像魅力一样工作:

http://www.microsoft.com/en-us/download/details.aspx?id=26798

假设您正在进行完全转储,这可能与它如何共同定位 sos 有关。在 3.5 下,它将使用 mscorlib 共置,而在 CLR 4 下,它将使用 clr 共置。这将取决于编写调试诊断的人是否能够容忍 CLR 4。

我遇到了同样的问题,对我来说,它有助于从 DebugDiag 的子目录"exts"中删除 psscor4.dll

在 DebugDiag-Report 中,我的 CLR 运行时 ist 现在显示为:

CLR Information
CLR version = 4.0.30319.18052
CLR Debugger Extension = C:'Windows'Microsoft.NET'Framework'v4.0.30319'sos.dll

PS:请注意使用正确版本的调试Diag(32位与64位)。