如何在 .NET 应用程序的转储中找到默认 TaskScheduler 的内容?

How to find a content of the default TaskScheduler in a dump of a .NET application?

我正在尝试在 .NET application 的转储中查找默认值 TaskScheduler 的内容。我该怎么做?

一个应用程序被挂起。

我需要确保默认调度程序包含 delayed task 和某个 delegate

首先找到TaskScheduler

的方法table
0:025> .loadby sos clr
0:025> .symfix c:\debug\symbols
0:025> !name2ee mscorlib.dll System.Threading.Tasks.TaskScheduler
Module:      000007feeea11000
Assembly:    mscorlib.dll
Token:       000000000200052e
MethodTable: 000007feef0a8ab0
EEClass:     000007feeebde1a8
Name:        System.Threading.Tasks.TaskScheduler

然后,转储堆以找到该类型的一些对象。请注意,我在这里使用的是 String,因为我没有带有可用 TaskScheduler 的应用程序。

0:025> !dumpheap -mt <MethodTable>

现在您已经有了一些对象,只需转储其中一个即可。

0:025> !do 00000000126ed548 
Name:        System.String
MethodTable: 000007feef0bda88
EEClass:     000007feeea16a08
Size:        34(0x22) bytes
File:        C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
String:      100%
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007feef0c03d0  4000243        8         System.Int32  1 instance                4 m_stringLength
000007feef0bec38  4000244        c          System.Char  1 instance               31 m_firstChar
000007feef0bda88  4000248       80        System.String  0   shared           static Empty

注意字符串的 shared(静态)属性 Empty。您应该在 TaskScheduler 中为静态 属性 Default.

得到类似的东西

如你所见,你什么也看不见。这就是为什么您需要 SOSEX 扩展并执行 !mdt System.Threading.Tasks.TaskScheduler.

0:025> !mdt System.String
System.String
[...]
    [s]Empty: string
        AppDomain 'Test.exe' (0000000001d73470): 0000000011fc1420[System.String] STRVAL=