WinDbg/SOS:如何将 !threads 命令中的托管线程与 System.Threading.Thread 实例关联起来

发布于 2024-10-10 12:35:07 字数 3103 浏览 5 评论 0原文

使用 WinDbg 和 SOS,我有以下问题:

0:011> !threads
ThreadCount: 7
UnstartedThread: 0
BackgroundThread: 4
PendingThread: 0
DeadThread: 2
                             PreEmptive   GC Alloc               Lock     
       ID ThreadOBJ    State     GC       Context       Domain   Count APT Exception
  0   618 0015b350        20 Enabled  00000000:00000000 0017b720     0 Ukn
  2   624 0016f508      b220 Enabled  00000000:00000000 0017b720     0 MTA (Finalizer)
  9   e48 001c13d0      1220 Enabled  00000000:00000000 0017b720     0 Ukn
 10   e8c 048c6a40   1800220 Enabled  00c296a8:00c2ab44 0017b720     0 MTA (Threadpool Worker) System.NullReferenceException
XXX     0 00224138      1820 Enabled  00000000:00000000 0017b720     0 MTA
XXX     0 001d5b50      1820 Enabled  00000000:00000000 0017b720     0 Ukn
 11   564 00166318   1800220 Enabled  00c2cf30:00c2eb44 0017b720     0 MTA (Threadpool Worker)
0:011> !dumpheap -type System.Threading.Thread
 Address       MT     Size
00b16478 79bba7a4       60
00b41a7c 79bca7ac       28
00b41a98 79bba7a4       60
00b41ecc 79bba7a4       60
00bf1e20 79bca7ac       28
00bf1e3c 79bba7a4       60
00c03b34 79bca7ac       28
00c03b50 79bba7a4       60
total 8 objects
Statistics:
      MT    Count TotalSize Class Name
79bca7ac        3        84 System.Threading.ThreadStart
79bba7a4        5       300 System.Threading.Thread
Total 8 objects

我的问题是:如何确定堆上的哪些 System.Threading.Thread 实例对应于实际执行的托管线程。

更新: 这是调试 .NET 1.1 应用程序。 在此版本中,我从 !DumpObj 得到这样的输出

0:000> !dumpobj 00b16478 
Name: System.Threading.Thread
MethodTable 0x79bba7a4
EEClass 0x79bba9d4
Size 60(0x3c) bytes
mdToken: 020000ec  (c:\windows\microsoft.net\framework\v1.1.4322\mscorlib.dll)
FieldDesc*: 79bbaa38
      MT    Field   Offset                 Type       Attr    Value Name
79bba7a4  4000337        4                CLASS   instance 00000000 m_Context
79bba7a4  4000338        8                CLASS   instance 00000000 m_LogicalCallContext
79bba7a4  4000339        c                CLASS   instance 00000000 m_IllogicalCallContext
79bba7a4  400033a       10                CLASS   instance 00000000 m_Name
79bba7a4  400033b       14                CLASS   instance 00000000 m_ExceptionStateInfo
79bba7a4  400033c       18                CLASS   instance 00000000 m_Delegate
79bba7a4  400033d       1c                CLASS   instance 00000000 m_PrincipalSlot
79bba7a4  400033e       20                CLASS   instance 00000000 m_ThreadStaticsBuckets
79bba7a4  400033f       24                CLASS   instance 00000000 m_ThreadStaticsBits
79bba7a4  4000340       28                CLASS   instance 00000000 m_CurrentCulture
79bba7a4  4000341       2c                CLASS   instance 00000000 m_CurrentUICulture
79bba7a4  4000342       30         System.Int32   instance        2 m_Priority
79bba7a4  4000343       34         System.Int32   instance  1422160 DONT_USE_InternalThread
79bba7a4  4000344        0                CLASS     shared   static m_LocalDataStoreMgr
    >> Domain:Value 0017b720:00b162e8 <<

Using WinDbg and SOS, I have the following:

0:011> !threads
ThreadCount: 7
UnstartedThread: 0
BackgroundThread: 4
PendingThread: 0
DeadThread: 2
                             PreEmptive   GC Alloc               Lock     
       ID ThreadOBJ    State     GC       Context       Domain   Count APT Exception
  0   618 0015b350        20 Enabled  00000000:00000000 0017b720     0 Ukn
  2   624 0016f508      b220 Enabled  00000000:00000000 0017b720     0 MTA (Finalizer)
  9   e48 001c13d0      1220 Enabled  00000000:00000000 0017b720     0 Ukn
 10   e8c 048c6a40   1800220 Enabled  00c296a8:00c2ab44 0017b720     0 MTA (Threadpool Worker) System.NullReferenceException
XXX     0 00224138      1820 Enabled  00000000:00000000 0017b720     0 MTA
XXX     0 001d5b50      1820 Enabled  00000000:00000000 0017b720     0 Ukn
 11   564 00166318   1800220 Enabled  00c2cf30:00c2eb44 0017b720     0 MTA (Threadpool Worker)
0:011> !dumpheap -type System.Threading.Thread
 Address       MT     Size
00b16478 79bba7a4       60
00b41a7c 79bca7ac       28
00b41a98 79bba7a4       60
00b41ecc 79bba7a4       60
00bf1e20 79bca7ac       28
00bf1e3c 79bba7a4       60
00c03b34 79bca7ac       28
00c03b50 79bba7a4       60
total 8 objects
Statistics:
      MT    Count TotalSize Class Name
79bca7ac        3        84 System.Threading.ThreadStart
79bba7a4        5       300 System.Threading.Thread
Total 8 objects

My question is: how can I determine which instances of System.Threading.Thread on the heap correspond to which of the managed threads actually executing.

Updated:
This is debugging a .NET 1.1 application.
In this version I get output like this from !DumpObj

0:000> !dumpobj 00b16478 
Name: System.Threading.Thread
MethodTable 0x79bba7a4
EEClass 0x79bba9d4
Size 60(0x3c) bytes
mdToken: 020000ec  (c:\windows\microsoft.net\framework\v1.1.4322\mscorlib.dll)
FieldDesc*: 79bbaa38
      MT    Field   Offset                 Type       Attr    Value Name
79bba7a4  4000337        4                CLASS   instance 00000000 m_Context
79bba7a4  4000338        8                CLASS   instance 00000000 m_LogicalCallContext
79bba7a4  4000339        c                CLASS   instance 00000000 m_IllogicalCallContext
79bba7a4  400033a       10                CLASS   instance 00000000 m_Name
79bba7a4  400033b       14                CLASS   instance 00000000 m_ExceptionStateInfo
79bba7a4  400033c       18                CLASS   instance 00000000 m_Delegate
79bba7a4  400033d       1c                CLASS   instance 00000000 m_PrincipalSlot
79bba7a4  400033e       20                CLASS   instance 00000000 m_ThreadStaticsBuckets
79bba7a4  400033f       24                CLASS   instance 00000000 m_ThreadStaticsBits
79bba7a4  4000340       28                CLASS   instance 00000000 m_CurrentCulture
79bba7a4  4000341       2c                CLASS   instance 00000000 m_CurrentUICulture
79bba7a4  4000342       30         System.Int32   instance        2 m_Priority
79bba7a4  4000343       34         System.Int32   instance  1422160 DONT_USE_InternalThread
79bba7a4  4000344        0                CLASS     shared   static m_LocalDataStoreMgr
    >> Domain:Value 0017b720:00b162e8 <<

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

若无相欠,怎会相见 2024-10-17 12:35:07

托管线程有一个成员变量 m_ManagedThreadId

0:000> !do 02f34b84 
Name:        System.Threading.Thread
MethodTable: 5259ffcc
EEClass:     522d8ed8
Size:        48(0x30) bytes
File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
52588a28  4000720        4 ....Contexts.Context  0 instance 02f7dc78 m_Context
5259b468  4000721        8 ....ExecutionContext  0 instance 02f3d4d4 m_ExecutionContext
5259f9ac  4000722        c        System.String  0 instance 00000000 m_Name
5259fe80  4000723       10      System.Delegate  0 instance 00000000 m_Delegate
525a63a4  4000724       14 ...ation.CultureInfo  0 instance 00000000 m_CurrentCulture
525a63a4  4000725       18 ...ation.CultureInfo  0 instance 00000000 m_CurrentUICulture
5259f5e8  4000726       1c        System.Object  0 instance 00000000 m_ThreadStartArg
5259aa2c  4000727       20        System.IntPtr  1 instance   4b6c18 DONT_USE_InternalThread
525a2978  4000728       24         System.Int32  1 instance        2 m_Priority
525a2978  4000729       28         System.Int32  1 instance        1 m_ManagedThreadId

m_ManagedThreadID 对应于 !threads 输出中的“ID”

0:000> !t
ThreadCount:      17
UnstartedThread:  0
BackgroundThread: 9
PendingThread:    0
DeadThread:       7
Hosted Runtime:   no
                                   PreEmptive   GC Alloc                Lock
       ID  OSID ThreadOBJ    State GC           Context       Domain   Count APT Exception
   0    1   390 004b6c18      6020 Enabled  0d98d408:0d98e080 004a85c8     0 STA
   4    2   790 004c5028      b220 Enabled  00000000:00000000 004a85c8     0 MTA (Finalizer)
   5    3  15e4 00555fd0      b220 Enabled  00000000:00000000 004a85c8     0 MTA
XXXX    5       060c27d8     19820 Enabled  00000000:00000000 004a85c8     0 Ukn
   7    6   84c 060c41f0   200b220 Enabled  00000000:00000000 004a85c8     0 MTA
  14    7  1aec 0611a760   200b220 Enabled  00000000:00000000 004a85c8     1 MTA
  17    8   ea0 08c787c8   200b220 Enabled  00000000:00000000 004a85c8     0 MTA
XXXX    9       0b409580     19820 Enabled  00000000:00000000 004a85c8     0 Ukn
XXXX    a       08cee2d0     19820 Enabled  00000000:00000000 004a85c8     0 Ukn
XXXX    b       08ceebc8     19820 Enabled  00000000:00000000 004a85c8     0 Ukn
XXXX    c       0b409a78     19820 Enabled  00000000:00000000 004a85c8     0 Ukn
XXXX    d       0b40a248     19820 Enabled  00000000:00000000 004a85c8     0 Ukn
XXXX    e       0b40b218     19820 Enabled  00000000:00000000 004a85c8     0 Ukn
  20    f  16d0 08cc1ad0   8009220 Enabled  00000000:00000000 004a85c8     0 MTA (Threadpool Completion Port)
  21   10  1ab4 0b4163f0   1009220 Enabled  0d9601ac:0d962080 004a85c8     0 MTA (Threadpool Worker)
  22   11  1924 0b40ef88   1009220 Enabled  0d9036c8:0d905554 004a85c8     0 MTA (Threadpool Worker)
  23    4  14d8 0b416ce0   100a220 Enabled  00000000:00000000 004a85c8     0 MTA (Threadpool Worker)

这是一个简单的脚本来转储托管线程对象及其 id

.foreach ($t {!dumpheap -mt 5259ffcc  -short}) {  .printf " Thread Obj ${$t} and the Thread Id is %N \n",poi(${$t}+28) }     

这是上面 .foreach 的输出

0:000> .foreach ($t {!dumpheap -mt 5259ffcc  -short}) {  .printf " Thread Obj ${$t} and the Thread Id is %N \n",poi(${$t}+28) }     
 Thread Obj 02f34b84 and the Thread Id is 00000001 
 Thread Obj 02f3d44c and the Thread Id is 00000003 
 Thread Obj 02f5f180 and the Thread Id is 00000005 
 Thread Obj 02f5f504 and the Thread Id is 00000006 
 Thread Obj 02f87780 and the Thread Id is 00000007 
 Thread Obj 03bdf8d8 and the Thread Id is 0000000C 
 Thread Obj 03bdff54 and the Thread Id is 00000008 
 Thread Obj 03d23f48 and the Thread Id is 00000009 
 Thread Obj 03d2491c and the Thread Id is 0000000A 
 Thread Obj 03d24a5c and the Thread Id is 0000000B 
 Thread Obj 03d24d34 and the Thread Id is 0000000D 
 Thread Obj 03d24ed8 and the Thread Id is 0000000E 
 Thread Obj 03d2bd24 and the Thread Id is 00000010 
 Thread Obj 03e48300 and the Thread Id is 00000002 
 Thread Obj 08f12f90 and the Thread Id is 00000011 

The managed thread has a member variable m_ManagedThreadId

0:000> !do 02f34b84 
Name:        System.Threading.Thread
MethodTable: 5259ffcc
EEClass:     522d8ed8
Size:        48(0x30) bytes
File:        C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
52588a28  4000720        4 ....Contexts.Context  0 instance 02f7dc78 m_Context
5259b468  4000721        8 ....ExecutionContext  0 instance 02f3d4d4 m_ExecutionContext
5259f9ac  4000722        c        System.String  0 instance 00000000 m_Name
5259fe80  4000723       10      System.Delegate  0 instance 00000000 m_Delegate
525a63a4  4000724       14 ...ation.CultureInfo  0 instance 00000000 m_CurrentCulture
525a63a4  4000725       18 ...ation.CultureInfo  0 instance 00000000 m_CurrentUICulture
5259f5e8  4000726       1c        System.Object  0 instance 00000000 m_ThreadStartArg
5259aa2c  4000727       20        System.IntPtr  1 instance   4b6c18 DONT_USE_InternalThread
525a2978  4000728       24         System.Int32  1 instance        2 m_Priority
525a2978  4000729       28         System.Int32  1 instance        1 m_ManagedThreadId

The m_ManagedThreadID corresponds to the "ID" in the !threads output

0:000> !t
ThreadCount:      17
UnstartedThread:  0
BackgroundThread: 9
PendingThread:    0
DeadThread:       7
Hosted Runtime:   no
                                   PreEmptive   GC Alloc                Lock
       ID  OSID ThreadOBJ    State GC           Context       Domain   Count APT Exception
   0    1   390 004b6c18      6020 Enabled  0d98d408:0d98e080 004a85c8     0 STA
   4    2   790 004c5028      b220 Enabled  00000000:00000000 004a85c8     0 MTA (Finalizer)
   5    3  15e4 00555fd0      b220 Enabled  00000000:00000000 004a85c8     0 MTA
XXXX    5       060c27d8     19820 Enabled  00000000:00000000 004a85c8     0 Ukn
   7    6   84c 060c41f0   200b220 Enabled  00000000:00000000 004a85c8     0 MTA
  14    7  1aec 0611a760   200b220 Enabled  00000000:00000000 004a85c8     1 MTA
  17    8   ea0 08c787c8   200b220 Enabled  00000000:00000000 004a85c8     0 MTA
XXXX    9       0b409580     19820 Enabled  00000000:00000000 004a85c8     0 Ukn
XXXX    a       08cee2d0     19820 Enabled  00000000:00000000 004a85c8     0 Ukn
XXXX    b       08ceebc8     19820 Enabled  00000000:00000000 004a85c8     0 Ukn
XXXX    c       0b409a78     19820 Enabled  00000000:00000000 004a85c8     0 Ukn
XXXX    d       0b40a248     19820 Enabled  00000000:00000000 004a85c8     0 Ukn
XXXX    e       0b40b218     19820 Enabled  00000000:00000000 004a85c8     0 Ukn
  20    f  16d0 08cc1ad0   8009220 Enabled  00000000:00000000 004a85c8     0 MTA (Threadpool Completion Port)
  21   10  1ab4 0b4163f0   1009220 Enabled  0d9601ac:0d962080 004a85c8     0 MTA (Threadpool Worker)
  22   11  1924 0b40ef88   1009220 Enabled  0d9036c8:0d905554 004a85c8     0 MTA (Threadpool Worker)
  23    4  14d8 0b416ce0   100a220 Enabled  00000000:00000000 004a85c8     0 MTA (Threadpool Worker)

And here is a simple script to dump the managed thread object and its id

.foreach ($t {!dumpheap -mt 5259ffcc  -short}) {  .printf " Thread Obj ${$t} and the Thread Id is %N \n",poi(${$t}+28) }     

Here is the output from the above .foreach

0:000> .foreach ($t {!dumpheap -mt 5259ffcc  -short}) {  .printf " Thread Obj ${$t} and the Thread Id is %N \n",poi(${$t}+28) }     
 Thread Obj 02f34b84 and the Thread Id is 00000001 
 Thread Obj 02f3d44c and the Thread Id is 00000003 
 Thread Obj 02f5f180 and the Thread Id is 00000005 
 Thread Obj 02f5f504 and the Thread Id is 00000006 
 Thread Obj 02f87780 and the Thread Id is 00000007 
 Thread Obj 03bdf8d8 and the Thread Id is 0000000C 
 Thread Obj 03bdff54 and the Thread Id is 00000008 
 Thread Obj 03d23f48 and the Thread Id is 00000009 
 Thread Obj 03d2491c and the Thread Id is 0000000A 
 Thread Obj 03d24a5c and the Thread Id is 0000000B 
 Thread Obj 03d24d34 and the Thread Id is 0000000D 
 Thread Obj 03d24ed8 and the Thread Id is 0000000E 
 Thread Obj 03d2bd24 and the Thread Id is 00000010 
 Thread Obj 03e48300 and the Thread Id is 00000002 
 Thread Obj 08f12f90 and the Thread Id is 00000011 
留蓝 2024-10-17 12:35:07

我现在看到 System.Threading.Thread 对象的 DONT_USE_InternalThread 字段的值是标题 ThreadOBJ 下出现的十六进制值的十进制等效值!threads 输出中的 code>。

I now see that the value of the DONT_USE_InternalThread field of my System.Threading.Thread object is the decimal equivalent of the hex value appearing under the heading ThreadOBJ in the !threads output.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文