如何使用SOS和Windbg从内存转储中列出枚举的值?

问题描述 投票:1回答:1

我有一个附有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。

.net enums windbg sos
1个回答
0
投票

首先简单:

0:000> !DumpObj /d 0d8e822c
[...]
Content:     ,    

您在这里做的是:列出enumSeperatorCharArray的值。它与您的枚举定义无关。所有枚举都有。

SOS IMHO无法列出枚举定义。为此,您需要

这里是调试会话:

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)
© www.soinside.com 2019 - 2024. All rights reserved.