【问题标题】:Correlate TPL task with right thread in WinDbg将 TPL 任务与 WinDbg 中的正确线程相关联
【发布时间】:2018-02-05 17:22:59
【问题描述】:

我们有一个应用程序启动一个数组(System.Threading.Tasks.Task)的一些任务。最后,它使用以下代码等待任务结束:

   Dim tasks As New List(Of Task)          
   For Each fator As String In Fatores
                tasks.Add( _
                    Task.Run(Sub()
                                 Calcular(New Object() {fator,})
                             End Sub))
    Next
    Task.WaitAll(tasks.ToArray())

在执行期间,我提取了一个完整的应用程序转储。使用 !Threads 我得到了下面的列表(最终被删除)。

身份证

OSID ThreadOBJ           State GC Mode     GC Alloc Context                  Domain           Count Apt Exception
   0    1 60d8 000000000045e540    26020 Preemptive  000000014DE5FE38:000000014DE5FFD0 00000000004492e0 0     STA 
   2    2 3c90 00000000004896d0    2b220 Preemptive  0000000000000000:0000000000000000 00000000004492e0 0     MTA (Finalizer) 
   5    3 309c 000000001d6ba3f0  102a220 Preemptive  0000000000000000:0000000000000000 00000000004492e0 0     MTA (Threadpool Worker) 
   7    4 743c 000000001d6eb920  202b220 Preemptive  0000000000000000:0000000000000000 00000000004492e0 0     MTA 
   8    5 7528 000000001d794080  202b220 Preemptive  000000014DE596F8:000000014DE59FD0 00000000004492e0 0     MTA 
   9    6 53f4 000000001d7bd720    21220 Preemptive  0000000000000000:0000000000000000 00000000004492e0 0     Ukn 
  10   17 239c 000000001fa04160  202b020 Preemptive  0000000000000000:0000000000000000 00000000004492e0 0     MTA 
  12 1134 20ec 0000000000474380  8029220 Preemptive  0000000000000000:0000000000000000 00000000004492e0 0     MTA (Threadpool Completion Port) 
  15  649 2e2c 00000000247fdd00  1029220 Preemptive  0000000000000000:0000000000000000 00000000004492e0 0     MTA (Threadpool Worker) 
  17  650 28ac 0000000000478bb0  1029220 Preemptive  0000000000000000:0000000000000000 00000000004492e0 0     MTA (Threadpool Worker) 
  16  651 47c8 000000006069d5a0  1029220 Preemptive  0000000000000000:0000000000000000 00000000004492e0 0     MTA (Threadpool Worker) 
XXXX  706    0 000000001fb2f9f0  1039820 Preemptive  0000000000000000:0000000000000000 00000000004492e0 0     Ukn (Threadpool Worker) 
  22  705 5dd0 000000001fb301c0  1029220 Preemptive  000000014DE5C098:000000014DE5DFD0 00000000004492e0 0     MTA (Threadpool Worker) 

使用命令 ~*e!clrstack 我可以在这一行找到任务列表

000000002083ead0 000007fee6c3bf95 System.Threading.Tasks.Task.WaitAllBlockingCore(System.Collections.Generic.List`1, Int32, System.Threading.CancellationToken) [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 5193]
000000002083eb70 000007fee6c3bbd0 System.Threading.Tasks.Task.WaitAll(System.Threading.Tasks.Task[], Int32, System.Threading.CancellationToken) [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 5109]

我在下面的参数中得到了任务列表

0:010> !dumparray 0000000120ca19d8    000000002083eb70 000007fee6c3bbd0 System.Threading.Tasks.Task.WaitAll(System.Threading.Tasks.Task[], Int32, System.Threading.CancellationToken) [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 5109]
        PARAMETERS:
            tasks (0x000000002083ec90) = 0x0000000120ca19d8
            millisecondsTimeout (0x000000002083ec98) = 0x00000000ffffffff
            cancellationToken = <no data>
Name:        System.Threading.Tasks.Task[]
MethodTable: 000007fee6f424c8
EEClass:     000007fee5e31238
Size:        72(0x48) bytes
Array:       Rank 1, Number of elements 6, Type CLASS
Element Methodtable: 000007fee642c650
[0] 0000000120ca1048
[1] 0000000120ca11f0
[2] 0000000120ca1398
[3] 0000000120ca1540
[4] 0000000120ca16e8
[5] 0000000120ca1890

每个任务都有下面的结构,其中似乎只有活动任务填充了字段 m_taskID

0:010> !DumpObj /d 0000000120ca1048
Name:        System.Threading.Tasks.Task
MethodTable: 000007fee642c650
EEClass:     000007fee5e36a30
Size:        72(0x48) bytes
File:        C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007fee6419540  4001a16       38         System.Int32  1 instance            42082 m_taskId
000007fee64170f0  4001a17        8        System.Object  0 instance 0000000000000000 m_action
000007fee64170f0  4001a18       10        System.Object  0 instance 0000000000000000 m_stateObject
000007fee64202b8  4001a19       18 ...sks.TaskScheduler  0 instance 0000000003e83d28 m_taskScheduler
000007fee642c650  4001a1a       20 ...eading.Tasks.Task  0 instance 0000000000000000 m_parent
000007fee6419540  4001a1b       3c         System.Int32  1 instance         16982024 m_stateFlags
000007fee64170f0  4001a2e       28        System.Object  0 instance 0000000003e83da8 m_continuationObject
000007fee64247e8  4001a33       30 ...tingentProperties  0 instance 0000000120ca1148 m_contingentProperties
000007fee6419540  4001a14      f30         System.Int32  1   shared           static s_taskIdCounter
                                 >> Domain:Value  00000000004492e0:42084 <<
000007fee6430ac8  4001a15      e80 ...Tasks.TaskFactory  0   shared           static s_factory
                                 >> Domain:Value  00000000004492e0:0000000003e83d80 <<
000007fee64170f0  4001a2f      e88        System.Object  0   shared           static s_taskCompletionSentinel
                                 >> Domain:Value  00000000004492e0:0000000003e83da8 <<
000007fee6439b50  4001a30      f34       System.Boolean  1   shared           static s_asyncDebuggingEnabled
                                 >> Domain:Value  00000000004492e0:0 <<
000007fee5d942c8  4001a31      e90 ....Task, mscorlib]]  0   shared           static s_currentActiveTasks
                                 >> Domain:Value  00000000004492e0:0000000003e83dc0 <<
000007fee64170f0  4001a32      e98        System.Object  0   shared           static s_activeTasksLock
                                 >> Domain:Value  00000000004492e0:0000000003e83e10 <<
000007fee6492148  4001a34      ea0 ...bject, mscorlib]]  0   shared           static s_taskCancelCallback
                                 >> Domain:Value  00000000004492e0:0000000003e83e28 <<
000007fee6492288  4001a35      ea8 ...rties, mscorlib]]  0   shared           static s_createContingentProperties
                                 >> Domain:Value  00000000004492e0:0000000003e83e68 <<
000007fee642c650  4001a36      eb0 ...eading.Tasks.Task  0   shared           static s_completedTask
                                 >> Domain:Value  00000000004492e0:0000000000000000 <<
000007fee6492320  4001a37      eb8 ....Task, mscorlib]]  0   shared           static s_IsExceptionObservedByParentPredicate
                                 >> Domain:Value  00000000004492e0:0000000003e83ec0 <<
000007fee6427a38  4001a38      ec0 ...g.ContextCallback  0   shared           static s_ecCallback
                                 >> Domain:Value  00000000004492e0:0000000003e84910 <<
000007fee64923b0  4001a39      ec8 ...bject, mscorlib]]  0   shared           static s_IsTaskContinuationNullPredicate
                                 >> Domain:Value  00000000004492e0:0000000003e83f00 <<
000007fee642c650  4001a12       28 ...eading.Tasks.Task  0   shared         TLstatic t_currentTask
    >> Thread:Value 60d8:0000000000000000 239c:0000000000000000 2e2c:0000000120ca1540 28ac:0000000120ca16e8 47c8:0000000120ca1890 <<
000007fee649d940  4001a13       30 ....Tasks.StackGuard  0   shared         TLstatic t_stackGuard
    >> Thread:Value 60d8:0000000005d88880 239c:0000000003fbbdd8 2e2c:0000000000000000 28ac:0000000000000000 47c8:0000000000000000 <<

我想知道如何将此任务与上面列表中的正确线程相关联。最后的字段 t_currentTask 和 t_stackGuard 具有所有有效线程 ,包括启动任务的 STA(Windows 窗体)。我查看了数组的另一个任务,最后两个字段在所有这些任务中都是相同的,没有提供有关相关线程的线索。我可以识别(通过线程的 !clrstack 中的方法名称)哪些线程正在执行任务,但我无法关联任务 X 线程。 谁能帮我做到这一点?提前致谢!

【问题讨论】:

    标签: multithreading task-parallel-library windbg


    【解决方案1】:

    我找到了一些帮助过我的微软人。如果任务正在运行的线程是“活动的”,我只能找到它。只需跟踪堆中的实例,如下所示。但是,与我的假设相反,m_taskId = 0 的任务对象是正在运行的任务。因此,如果有任何进程被锁定等待某个任务,如果我在任何地方都找不到它,那是因为它中止并且没有向正在等待其结束的人报告状态。

    0:010> !DumpArray /d 0000000120ca19d8
    Name:        System.Threading.Tasks.Task[]
    MethodTable: 000007fee6f424c8
    EEClass:     000007fee5e31238
    Size:        72(0x48) bytes
    Array:       Rank 1, Number of elements 6, Type CLASS
    Element Methodtable: 000007fee642c650
    [0] 0000000120ca1048
    [1] 0000000120ca11f0
    [2] 0000000120ca1398
    [3] 0000000120ca1540
    [4] 0000000120ca16e8
    [5] 0000000120ca1890
    0:010> !gcroot 0000000120ca1890
    Thread 239c:
        000000002083ead0 000007fee6c3bf95 System.Threading.Tasks.Task.WaitAllBlockingCore(System.Collections.Generic.List`1<System.Threading.Tasks.Task>, Int32, System.Threading.CancellationToken) [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 5193]
            rbp+10: 000000002083eb70
                ->  0000000120ca1a20 System.Collections.Generic.List`1[[System.Threading.Tasks.Task, mscorlib]]
                ->  0000000120ca1a48 System.Threading.Tasks.Task[]
                ->  0000000120ca1890 System.Threading.Tasks.Task
        000000002083eb70 000007fee6c3bbd0 System.Threading.Tasks.Task.WaitAll(System.Threading.Tasks.Task[], Int32, System.Threading.CancellationToken) [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 5109]
            rbp+10: 000000002083ec90
                ->  0000000120ca19d8 System.Threading.Tasks.Task[]
                ->  0000000120ca1890 System.Threading.Tasks.Task
    Thread 47c8:
        000000002059e020 000007fee629c686 System.Threading.Tasks.Task.Execute() [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 2498]
            rbp+10: 000000002059e060
                ->  0000000120ca1890 System.Threading.Tasks.Task
        000000002059e060 000007fee6274750 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs @ 954]
            r14: 
                ->  0000000120ca1890 System.Threading.Tasks.Task
        000000002059e160 000007fee629c928 System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef) [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 2827]
            rbp+18: 000000002059e218 (interior)
                ->  0000000120cb0fe8 System.Object[]
                ->  0000000120ca1890 System.Threading.Tasks.Task
        000000002059e160 000007fee629c928 System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef) [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 2827]
            rbp+10: 000000002059e210
                ->  0000000120ca1890 System.Threading.Tasks.Task
        000000002059e250 000007fee627f74e System.Threading.ThreadPoolWorkQueue.Dispatch() [f:\dd\ndp\clr\src\BCL\system\threading\threadpool.cs @ 820]
            rbp-20: 000000002059e2c0
                ->  0000000120ca1890 System.Threading.Tasks.Task
    Found 7 unique roots (run '!GCRoot -all' to see all roots).
    

    就是这样

    【讨论】:

      猜你喜欢
      • 2011-06-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多