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

Lun*_*per 6 .net windbg dump task sos

我试图TaskScheduler在转储中找到默认的内容.NET application.我怎么能这样做?

申请被挂了.

申请被挂了

我需要确保默认调度程序包含delayed task一个特定的delegate.

Tho*_*ler 1

首先找到TaskScheduler的方法表

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
Run Code Online (Sandbox Code Playgroud)

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

0:025> !dumpheap -mt <MethodTable>
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

注意字符串的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=
Run Code Online (Sandbox Code Playgroud)