为什么psscor4命令无法运行?

6

由于某些原因,我加载了 psscor4 后无法运行任何命令。 我已从 MS 网站下载了 x64 版本的psscor4 并将其放在与windbg相同的文件夹中。 在加载 psscor4之前,我可以正常运行sos命令,没有任何问题。

0:003> .loadby sos clr

0:003> lmvm clr
start             end                 module name
00007ffa`35630000 00007ffa`35fc8000   clr        (deferred)             
    Image path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
    Image name: clr.dll
    Timestamp:        Wed Nov 27 19:25:30 2013 (52968D7A)
    CheckSum:         00996ED8
    ImageSize:        00998000
    File version:     4.0.30319.34011
    Product version:  4.0.30319.34011
    File flags:       8 (Mask 3F) Private
    File OS:          4 Unknown Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0409.04b0
    CompanyName:      Microsoft Corporation
    ProductName:      Microsoft® .NET Framework
    InternalName:     clr.dll
    OriginalFilename: clr.dll
    ProductVersion:   4.0.30319.34011
    FileVersion:      4.0.30319.34011 built by: FX45W81RTMGDR
    PrivateBuild:     DDBLD109
    FileDescription:  Microsoft .NET Runtime Common Language Runtime - WorkStation
    LegalCopyright:   © Microsoft Corporation.  All rights reserved.
    Comments:         Flavor=Retail

    0:003> !DumpHeap -type ConsoleApplication1.Dummy
         Address               MT     Size
0000000002022f58 00007ff9d5ec4130       40     

Statistics:
              MT    Count    TotalSize Class Name
00007ff9d5ec4130        1           40 ConsoleApplication1.Dummy
Total 1 objects

0:003> !DumpHeap -mt 00007ff9d5ec4130
         Address               MT     Size
0000000002022f58 00007ff9d5ec4130       40     

Statistics:
              MT    Count    TotalSize Class Name
00007ff9d5ec4130        1           40 ConsoleApplication1.Dummy
Total 1 objects

0:003> !do 0000000002022f58 
Name:        ConsoleApplication1.Dummy
MethodTable: 00007ff9d5ec4130
EEClass:     00007ff9d5fd23b8
Size:        40(0x28) bytes
File:        c:\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
00007ffa34635740  4000001        8        System.Byte[]  0 instance 0000000012029740 bytes
00007ffa34632838  4000002       18         System.Int32  1 instance                0 <ID>k__BackingField
00007ffa3464d5b8  4000003       10        System.Double  1 instance 0.000000 <SomeThing>k__BackingField

当我加载psscor4后,无法运行任何sos命令。

0:003> .load psscor4
0:003> !DumpHeap -type ConsoleApplication1.Dummy
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

0:003> !DumpHeap -mt 00007ff9d5ec4130
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

0:003> !do 0000000002022f58 
<Note: this object has an invalid CLASS field>
Invalid object

我可以在添加sos前缀后运行这些命令。因此,!sos.do可以正常工作。但问题是我无法运行任何psscor4特定的命令。有任何想法是出了什么问题吗?我认为psscor4输出的错误信息是误导性的,因为我认为当我将windbg附加到此进程时没有发生任何GC。

编辑 以下是用于.NET 4.0的配置。哪一个可以与psscor4一起使用? enter image description here


3
请参考我的更新回答:由于.NET 4.5是.NET 4的原地更新,将目标框架设置为4.0并不能起到帮助作用。这取决于实际安装在运行你的应用程序的计算机上的.NET版本。 - Thomas Weller
2个回答

10

PSSCOR4

你的.NET版本号为4.0.30319.34011,但实际上是.NET 4.5。PSSCOR4发布于2011年02月01日,目前还不支持.NET 4.5。它只能与.NET 4.0一起使用,对于你的情况来说是无用的。

由于.NET 4.5是.NET 4的原地更新,将目标框架设置为4.0并不能解决问题。这取决于运行应用程序的PC上实际安装的.NET版本。

多个扩展名

有些扩展可能与其他扩展具有相同的命令。你可以通过以下方式找到PSSCOR 4的可用命令:

0:000> .extmatch /e *psscor4* *

从列表中可以看出,PSSCOR4是SOS的超集,具有SOS的所有命令以及一些其他命令。

命名冲突可以通过以下两种方式解决:

  1. 使用.setdll <dllname>定义默认DLL
  2. 使用!<extension>.<command>进行显式调用

执行!sos.do时选择了第二种方法。


据我所知,我已经从项目属性选项中选择了.NET 4.0。请参见问题中的图片(刚刚添加)。 - crazy novice

6

转储正在运行CLR v4.5(4.0.30319.34011)。Psscor4不支持.NET 4.5+。


这有点令人困惑 :) 我在问题中添加了一些细节。你能澄清一下吗? - crazy novice
2
.NET Framework 4是PSSCOR4兼容的唯一目标。每当您调试转储文件时,如果v4版本号在最后一位有五个数字,那么您就在使用.NET 4.5+,而PSSCOR4将无法工作。 - Steve Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接