加载 psscor4 时:垃圾收集器数据结构未处于有效遍历状态

On loading psscor4: The garbage collector data structures are not in a valid state for traversal

我正在实时调试会话中调试 Microsoft Word。该过程加载了一些托管加载项,因此我使用的是 sos 和 psscor4。进程 winword.exe 是一个 32 位进程,但托管加载项将 MSIL 作为其 PlatformArchitecture 枚举的值,这意味着它们被编译为在任何平台上进行 JITT。

我正在使用 Windbg (x86)。

一旦我从 C:\Windows\Microsoft.NET\Framework\v4.0.30319 目录加载 psscor4,然后尝试任何与 GC 相关的命令,例如 !clrusage 命令,我收到此消息:

The garbage collector data structures are not in a valid state for traversal. It is either in the "plan phase," where objects are being moved around, or we are at the initialization or shutdown of the gc heap. Commands related to displaying, finding or traversing objects as well as gc heap segments may not work properly. !dumpheap and !verifyheap may incorrectly complain of heap consistency errors. Error requesting GC Heap data Unable to build snapshot of the garbage collector state.

加载psscor4期间,连GC相关的sos命令都不起作用。例如,如果我 运行 heapstatdumpheapeeheap -gc 命令,它们将不起作用。

我一卸载 psscor4,它们就恢复工作。

PSSCOR 可能不适用于您的情况,因为您的插件使用 .NET 4.5 和 PSSCOR4 was not built for .NET 4.5。您可以使用 lm vm clr 检查 .NET 版本。如果显示 4.0.30319.18401 或更高版本,则为 .NET 4.5。

!heapstat!dumpheap!eeheap 不起作用,因为 PSSCOR4 带来了这些命令的自己的版本。您可以使用 .extmatch /e *psscor4* * 命令进行验证。

这取决于加载扩展的顺序,哪个是默认的。您可以使用 .chain 显示已加载的扩展,默认的在顶部。您可以使用 .setdll.

将不同的扩展名设置为默认扩展名

如果您不想更改默认扩展名,您还可以明确定义要与 !sos.heapstat 等类似的 SOS 扩展名。