Multithreading 如何使用windbg检查转储分析中每分钟等待的线程

Multithreading 如何使用windbg检查转储分析中每分钟等待的线程,multithreading,windbg,dump,Multithreading,Windbg,Dump,我已经使用任务管理器获取了正在运行的应用程序的转储文件,并在windbg中打开了该转储文件。 我知道在我的C#应用程序中,一个线程正在轮询某个任务1分钟。如果它没有得到它,它将等待10毫秒,然后再次开始轮询1分钟。 我在转储文件中看到这么多线程: ~ # 0 Id: 2208.1aa8 Suspend: 0 Teb: 00000098`eecc4000 Unfrozen 1 Id: 2208.5cc Suspend: 0 Teb: 00000098`eeccc000 Unfroze

我已经使用任务管理器获取了正在运行的应用程序的转储文件,并在windbg中打开了该转储文件。
我知道在我的C#应用程序中,一个线程正在轮询某个任务1分钟。如果它没有得到它,它将等待10毫秒,然后再次开始轮询1分钟。 我在转储文件中看到这么多线程:

 ~
#  0  Id: 2208.1aa8 Suspend: 0 Teb: 00000098`eecc4000 Unfrozen
   1  Id: 2208.5cc Suspend: 0 Teb: 00000098`eeccc000 Unfrozen
   2  Id: 2208.c38 Suspend: 0 Teb: 00000098`eecce000 Unfrozen
   3  Id: 2208.2810 Suspend: 0 Teb: 00000098`eecda000 Unfrozen
   4  Id: 2208.10e0 Suspend: 0 Teb: 00000098`eecdc000 Unfrozen
.  5  Id: 2208.2d28 Suspend: 0 Teb: 00000098`eecde000 Unfrozen
   6  Id: 2208.161c Suspend: 0 Teb: 00000098`eece0000 Unfrozen
   7  Id: 2208.15e4 Suspend: 0 Teb: 00000098`eece2000 Unfrozen
   8  Id: 2208.27a4 Suspend: 0 Teb: 00000098`eece8000 Unfrozen
   9  Id: 2208.2308 Suspend: 0 Teb: 00000098`eecec000 Unfrozen
  10  Id: 2208.d08 Suspend: 0 Teb: 00000098`eecf2000 Unfrozen
  11  Id: 2208.2f7c Suspend: 0 Teb: 00000098`eecf4000 Unfrozen
  12  Id: 2208.1338 Suspend: 0 Teb: 00000098`eecfc000 Unfrozen
现在,我如何检查哪个特定线程正在执行轮询任务。 我试图看到线程的堆栈跟踪,但并没有任何意义

例如,线程0具有以下堆栈跟踪:

  0  Id: 2208.1aa8 Suspend: 0 Teb: 00000098`eecc4000 Unfrozen
      Start: IDBrigade+0x4bf0e (0000019d`b17bbf0e) 
      Priority: 0  Priority class: 32  Affinity: f
Child-SP          RetAddr           Call Site
00000098`eeefe8a8 00007ffb`13e88933 ntdll!ZwWaitForSingleObject+0x14
00000098`eeefe8b0 00007ffb`153415bf KERNELBASE!WaitForSingleObjectEx+0x93
00000098`eeefe950 00007ffb`15340ea0 sechost!ScSendResponseReceiveControls+0x13b
00000098`eeefea90 00007ffb`153419e0 sechost!ScDispatcherLoop+0x140
00000098`eeefebd0 00007ffb`02cfbf47 sechost!StartServiceCtrlDispatcherW+0x70
00000098`eeefec00 00007ffb`02cfeea6 System_ServiceProcess_ni+0x2bf47
00000098`eeefecb0 00007ffa`a75004fb System_ServiceProcess_ni+0x2eea6
00000098`eeefed20 00007ffb`06ae6813 0x7ffa`a75004fb
00000098`eeefed70 00007ffb`06ae66c8 clr!CallDescrWorkerInternal+0x83
00000098`eeefedb0 00007ffb`06ae6d9d clr!CallDescrWorkerWithHandler+0x4e
00000098`eeefedf0 00007ffb`06b4d16c clr!MethodDescCallSite::CallTargetWorker+0xf8
00000098`eeefeef0 00007ffb`06b4d356 clr!RunMain+0x1e7
00000098`eeeff0d0 00007ffb`06b4d24b clr!Assembly::ExecuteMainMethod+0xb6
00000098`eeeff3c0 00007ffb`06b4d044 clr!SystemDomain::ExecuteMainMethod+0x57c
00000098`eeeff9d0 00007ffb`06b4cfc2 clr!ExecuteEXE+0x3f
00000098`eeeffa40 00007ffb`06b4d3f4 clr!_CorExeMainInternal+0xb2
00000098`eeeffad0 00007ffb`07947cbd clr!CorExeMain+0x14
00000098`eeeffb10 00007ffb`0821a57c mscoreei!CorExeMain+0x112
00000098`eeeffb70 00007ffb`14e47974 mscoree!CorExeMain_Exported+0x6c
00000098`eeeffba0 00007ffb`17a1a271 kernel32!BaseThreadInitThunk+0x14
00000098`eeeffbd0 00000000`00000000 ntdll!RtlUserThreadStart+0x21

我弄不明白这有什么道理谁能帮忙吗?这是我第一次做这个线程转储分析。

你需要一个小间隔的转储序列,然后
!失控
这是一个CLR进程。因此,某些堆栈帧将没有有用的函数名。您可以从加载SOS开始,然后使用!sos.dumpstack。或者,如果您同时需要本机线程和托管线程,您可以下载SOSEX并使用!sosex.mk。您应该能够通过调用堆栈中的方法调用来识别线程。开始查看.NET线程(
!SOS扩展的threads
)而不是本机线程“再次开始轮询1分钟”-您的意思是在无休止的循环中,没有任何睡眠?那么@Dono是对的。做一个
~*e!转储堆栈
。“等待10毫秒”-真的吗?它是怎么做到的?考虑到定时器分辨率一般为17MS。