首页 > 解决方案 > 如何使用windbg在转储分析中每分钟检查哪个线程正在等待

问题描述

我已经使用任务管理器转储了正在运行的应用程序,并在 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

我无法理解它..有人可以帮忙吗?这是我第一次做这个线程转储分析..

标签: multithreadingwindbgdump

解决方案


推荐阅读