为什么Windbg的SOS扩展不能给我Syncblock数据?

问题描述 投票:0回答:1

我正在使用 Windbg GUI 尝试解决 WPF 应用程序中的错误,该应用程序与 dotnet SDK 8.0.108 是独立的

如果我运行“!syncblk”,我会收到以下错误消息:

请求 SyncBlk 数据时出错

任何人都可以帮我解决此错误消息吗?为什么获取不到syncblk数据?

根据要求,我创建了一个最小的可重现示例here

重现步骤:

  • 克隆该存储库
  • 运行控制台项目 - 它将在桌面上创建一个转储文件
  • 运行 wpf 项目,然后单击按钮 - 它将在桌面上创建第二个转储文件
  • 打开第一个转储文件(从控制台项目),然后输入“!syncblk”命令 - 它应该可以工作
  • 打开第二个转储文件(来自 wpf 项目),然后输入“!syncblk”命令 - 它应该给出错误消息“请求 SyncBlk 数据时出错”。

我很想知道是否有其他人可以验证相同的复制品,或者它是否特定于我的机器。

我使用的是 WinDbg 1.2407.24003.0,带有默认的 SOS 扩展名。

.net windbg
1个回答
0
投票

您正在自己创建故障转储。它不是由调试器创建的。

在你的代码中

        var dumpType = DumpType.Normal;
// var dumpType = DumpType.WithHeap;

SyncBlock 与堆上的对象一起存储。除了对象数据之外,还有对象前面的方法表(MT)和方法表前面的同步块。正如 MS 文章中所解释的那样。

为了分析同步块,您需要堆,因为信息就在那里。解决方案在注释的代码行中:使用堆信息存储故障转储。

为什么

DumpType.WithHeap
失败并显示 HRESULT 0x80004005 (E_FAIL) - 我不知道。我切换到
DumpType.Full
并且可以成功运行
!syncblk
:

0:000> !syncblk
Index         SyncBlock MonitorHeld Recursion Owning Thread Info          SyncBlock Owner
-----------------------------
Total           80
CCW             5
RCW             10
ComClassFactory 0
Free            0
© www.soinside.com 2019 - 2024. All rights reserved.