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

时间:2017-04-10 20:07:15

标签: .net debugging garbage-collection windbg sos

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

我正在使用Windbg(x86)。

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

  

垃圾收集器数据结构未处于有效状态   遍历。它处于“计划阶段”,即物体所处的位置   四处走动,或者我们正处于gc的初始化或关闭状态   堆。与显示,查找或遍历对象相关的命令   以及gc堆段可能无法正常工作。 !dumpheap和   !verifyheap可能错误地抱怨堆一致性错误。错误   请求GC堆数据无法构建垃圾快照   收藏家国家。

在加载psscor4期间,即使与GC相关的sos命令也不起作用。例如,如果我运行heapstatdumpheapeeheap -gc命令,则它们不起作用。

我卸下psscor4后立即恢复工作。

1 个答案:

答案 0 :(得分:3)

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扩展名。