我有一个附有windbg的迷你转储。小型转储来自运行在IIS上的.NET 4.6.1 ASP.NET站点。我想获取我的枚举的定义,但是每当我获得该类的MethodTable时,我只会得到以下内容。
0:000> !DumpMT /d 256db60c
EEClass: 256c773c
Module: 201fcfb0
Name: MyDll.eDefaultRelatedObjects
mdToken: 02000029
File: C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\303e164d\216bec4f\assembly\dl3\bdb2a421\004bd941_fee1d501\MyDll.dll
BaseSize: 0xc
ComponentSize: 0x0
Slots in VTable: 23
Number of IFaces in IFaceMap: 3
0:000> !DumpClass /d 256c773c
Class Name: MyDll.eDefaultRelatedObjects
mdToken: 02000029
File: C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\303e164d\216bec4f\assembly\dl3\bdb2a421\004bd941_fee1d501\MyDll.dll
Parent Class: 717f17cc
Module: 201fcfb0
Method Table: 256db60c
Vtable Slots: 17
Total Method Slots: 17
Class Attributes: 101
Transparency: Critical
NumInstanceFields: 1
NumStaticFields: 0
MT Field Offset Type VT Attr Value Name
71c9f54c 400055f 124 System.Char[] 0 shared static enumSeperatorCharArray
>> Domain:Value 09671520:NotInit 306d85b0:0d8e822c 306da248:NotInit 306d98c0:NotInit 306dc868:138690b0 <<
71ca0994 400007d 4 System.Int32 1 instance value__
我已经查看了appdomain中的值,但它们只是逗号。
0:000> !DumpObj /d 0d8e822c
Name: System.Char[]
MethodTable: 71c9f54c
EEClass: 71874c84
Size: 14(0xe) bytes
Array: Rank 1, Number of elements 1, Type Char (Print Array)
Content: ,
Fields:
None
我需要怎么做才能从堆上的对象定义枚举?
EDIT1:如果有区别,我可以访问PDB。
首先简单:
0:000> !DumpObj /d 0d8e822c
[...]
Content: ,
您在这里做的是:列出enumSeperatorCharArray
的值。它与您的枚举定义无关。所有枚举都有。
SOS IMHO无法列出枚举定义。为此,您需要sosex。
这里是调试会话:
0:006> .loadby sos clr
0:006> .load D:\mylongpath\sosex.dll
0:006> !dumpheap -type YourEnum
Address MT Size
02cf2480 01154dc4 12
Statistics:
MT Count TotalSize Class Name
01154dc4 1 12 DebuggingEnumDefinition.YourEnum
Total 1 objects
所以有一个对象,可以像您一样看它。在输出的最后,您可以看到其十进制值,该值为65,并不是很有用。
0:006> !DumpObj /d 02cf2480
Name: DebuggingEnumDefinition.YourEnum
[...]
61bf42a8 4000001 4 System.Int32 1 instance 65 value__
使用SOSEX'!mdt
,您可以列出枚举常量:
0:006> !mdt DebuggingEnumDefinition.YourEnum
DebuggingEnumDefinition.YourEnum
[s]enumSeperatorCharArray: char[]
AppDomain 'DebuggingEnumDefinition.exe' (00c8dc18): <uninitialized>
[s]enumSeperator: string
AppDomain 'DebuggingEnumDefinition.exe' (00c8dc18): <Field def not loaded>
value__: int
[s]EnumVal1: DebuggingEnumDefinition.YourEnum
AppDomain 'DebuggingEnumDefinition.exe' (00c8dc18): <Field def not loaded>
[s]EnumVal2: DebuggingEnumDefinition.YourEnum
AppDomain 'DebuggingEnumDefinition.exe' (00c8dc18): <Field def not loaded>
[s]EnumVal3: DebuggingEnumDefinition.YourEnum
AppDomain 'DebuggingEnumDefinition.exe' (00c8dc18): <Field def not loaded>
实际上,我也期望数值。也许是因为SOSEX是为.NET 4.6制作的,但是我在这里使用4.7.2。
您还可以将!mdt
与对象的地址一起使用,因此可以获得其常数和十六进制值(0x41 == 65):
0:006> !mdt 02cf2480
0x41 (EnumVal3) (DebuggingEnumDefinition.YourEnum)