我正在实时调试会话中调试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命令也不起作用。例如,如果我运行heapstat
或dumpheap
或eeheap -gc
命令,则它们不起作用。
我卸下psscor4后立即恢复工作。
答案 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扩展名。