使用WinDbg和SOS,死锁或失控线程调试挂起的.net应用程序?

问题描述 投票:2回答:2

我正在使用WinDbg和SOS来调试挂起的.NET应用程序(在应用程序关闭后保留在TaskManager中)。当我执行!threads命令时,我得到下面的输出。它只显示一个线程具有锁定计数= 1。

0:002> !threads
ThreadCount:      132
UnstartedThread:  2
BackgroundThread: 54
PendingThread:    0
DeadThread:       48
Hosted Runtime:   no
                                                                                                        Lock  
       ID OSID ThreadOBJ           State GC Mode     GC Alloc Context                  Domain           Count Apt Exception
   0    1 13010 000002716ae37680  2036220 Preemptive  00000271060C1958:00000271060C36E8 000002716ae2afd0 0     STA 
   2    2 106e4 000002716ae63220    2b220 Preemptive  0000027105FB9778:0000027105FBB6E8 000002716ae2afd0 0     MTA (Finalizer) 
XXXX    3    0 000002716d1b8360  8039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Completion Port) 
XXXX    4    0 000002716d1ca8b0  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
   7    5 14570 000002716d23e290  3029220 Preemptive  0000027105FF1D08:0000027105FF36E8 000002716ae2afd0 0     MTA (Threadpool Worker) 
  10    7 14c54 000002716d85ddc0  102a220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA (Threadpool Worker) 
  12    8 12758 000002716d8b56a0  202b220 Preemptive  00000271060457C8:00000271060476E8 000002716ae2afd0 1     MTA 
XXXX    9    0 000002716d8795d0  8039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Completion Port) 
  13   10 12ef8 000002716d8b95d0  1020220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
  15   11 11e04 000002716d8d21c0  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  16   12 14b30 000002716d8dbd50  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  17   14 14760 000002716d819c30  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
XXXX   15    0 000002716d21c7a0  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
  18   16 143e8 0000027170b91780  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  19   17 13b9c 0000027170ba5800  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  20   18 11278 0000027170bb8600  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  21   19 14608 000002716d805310  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  22   20 131f8 000002716d8e0830  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  23   21 14a54 000002716d8e1000  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  24   22 13d78 000002716d8e1fa0  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  25   23 10da8 000002716d8de8f0  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  26   24 137c4 0000027170b99a90  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  27   25 12580 0000027170b9a260  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  28   26 14388 0000027170b9aa30  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  29   27 12390 0000027170b95440  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  30   28 f5b4 0000027170b9b200  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  31   29 fde8 0000027170b963e0  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  32   30 13114 0000027170b97380  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  33   31 14068 0000027170b98320  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  34   32 14a38 0000027170ba7790  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  35   33 1391c 0000027170ba67f0  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  36   34 13a64 0000027170ba6fc0  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  37   35 f764 0000027170bac5b0  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  38   36 f818 0000027170baae40  1029220 Preemptive  0000027106299D48:000002710629B6E8 000002716ae2afd0 0     MTA (Threadpool Worker) 
  39   37 14738 0000027170bacd80  1029220 Preemptive  0000027106275548:00000271062756E8 000002716ae2afd0 0     MTA (Threadpool Worker) 
XXXX   38    0 0000027170ba7f60  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
  40   39 1232c 0000027170ba6020  3029220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA (Threadpool Worker) 
XXXX   40    0 0000027170db57e0  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
XXXX   41    0 0000027170db5010  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
XXXX   42    0 0000027170db7720  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
  42   43 14d6c 0000027170db4840  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  43   44 13d70 0000027170db1960  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
XXXX   45    0 0000027170db2130    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
XXXX   46    0 0000027170db4070    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
XXXX   47    0 00000271731b4650    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
  44   48 60ec 00000271731b0fa0    2b020 Preemptive  000002710617F738:00000271061816E8 000002716ae2afd0 0     MTA 
  45   49 132d8 00000271731b36b0  202b020 Preemptive  000002710617D738:000002710617F6E8 000002716ae2afd0 0     MTA 
  46   50 134cc 00000271731b1770  202b020 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  47   51 14028 00000271731b2ee0  202b020 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
XXXX   52    0 00000271731b3e80    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
XXXX   53    0 00000271731b1f40    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
  48   54 14bf0 00000271731b07d0  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  49   55 1147c 00000271731c8800  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  50   56 1467c 00000271731c8030    2b020 Preemptive  0000027106185738:00000271061876E8 000002716ae2afd0 0     MTA 
  51   57 14148 00000271731cbeb0  202b020 Preemptive  0000027106183738:00000271061856E8 000002716ae2afd0 0     MTA 
  52   58 14574 00000271731cc680  202b020 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  53   59 12444 00000271731c5920  202b020 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
XXXX   60    0 00000271731c7090    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
XXXX   61    0 00000271731c8fd0     9600 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
XXXX   62    0 00000271731c7860     9600 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
  54   63 14904 00000271731c97a0  202b220 Preemptive  0000027106359808:000002710635B6E8 000002716ae2afd0 0     MTA 
  55   64 12920 00000271731f67c0    2b020 Preemptive  000002710634F700:00000271063516E8 000002716ae2afd0 0     MTA 
  56   65 14e54 00000271731f5050  202b020 Preemptive  0000027106189738:000002710618B6E8 000002716ae2afd0 0     MTA 
  57   66 14e34 00000271731fb5e0  202b020 Preemptive  0000027106354F28:00000271063556E8 000002716ae2afd0 0     MTA 
  58   67 11d88 00000271731fa640  202b020 Preemptive  00000271060797D8:000002710607B6E8 000002716ae2afd0 0     MTA 
XXXX   68    0 00000271731fae10    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
  60   69 12d2c 00000271731fbdb0  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
XXXX   70    0 00000271731f9e70    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
  59   71 12e5c 00000271731f8ed0    2b020 Preemptive  0000027106193738:00000271061956E8 000002716ae2afd0 0     MTA 
  61   72 14a94 000002717320c730  202b020 Preemptive  0000027106191738:00000271061936E8 000002716ae2afd0 0     MTA 
  62   73 fd58 0000027173213f70  202b020 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  63   74 13858 0000027173212030  202b020 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  64   75 ef34 00000271732185c0  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
XXXX   76    0 00000271732156e0    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
  65   77 fd9c 0000027173216680  202b220 Preemptive  0000027106094C80:00000271060956E8 000002716ae2afd0 0     MTA 
  66   78 129a4 0000027173217620  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
XXXX   79    0 0000027173211090    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
  67   80 13120 0000027173209080  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  68   81 147ec 000002717320fde0  202b220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
XXXX   82    0 000002717320a7f0    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
  69   83 12720 000002717320bf60    2b020 Preemptive  000002710619D738:000002710619F6E8 000002716ae2afd0 0     MTA 
  70   84 f42c 000002717320cf00    2b020 Preemptive  0000027106199738:000002710619B6E8 000002716ae2afd0 0     MTA 
  71   85 148a0 000002717320ee40    2b020 Preemptive  00000271061A1738:00000271061A36E8 000002716ae2afd0 0     MTA 
  72   86 14f50 000002717320dea0  202b020 Preemptive  0000027106197738:00000271061996E8 000002716ae2afd0 0     MTA 
  73   87 14690 000002717320e670  202b020 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  74   88 13dd0 0000027173256850  202b020 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  75   89 13adc 0000027173257020  202b020 Preemptive  000002710619B738:000002710619D6E8 000002716ae2afd0 0     MTA 
  76   90 13668 0000027173254910  202b020 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  77   91 14d78 0000027173258f60  202b020 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  78   92 12f54 00000271732558b0  202b020 Preemptive  000002710619F738:00000271061A16E8 000002716ae2afd0 0     MTA 
  79   93 13e38 0000027173252200  202b020 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
  80   94 14938 0000027173251a30  202b020 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     MTA 
XXXX   95    0 000002717325a6d0  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
  81   96 14064 000002717325aea0    27220 Preemptive  0000027106361B90:00000271063636E8 000002716ae2afd0 0     STA 
  82   97 11fb8 000002717325c610    27220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     STA 
XXXX   98    0 000002717325d5b0    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
  83   99 13580 000002717325e550  8029220 Preemptive  00000271062F4B28:00000271062F56E8 000002716ae2afd0 0     MTA (Threadpool Completion Port) 
XXXX  100    0 0000027173258790  8039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Completion Port) 
   8  101 7e2c 000002717325fcc0    20220 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
XXXX  102    0 000002717325dd80    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
XXXX  103    0 0000027173260490    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
XXXX  104    0 000002716aea61b0    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
XXXX  105    0 000002717343f830    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
XXXX  106    0 0000027173440000    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
  84  107 13848 0000027173444650  1029220 Preemptive  00000271062F2720:00000271062F36E8 000002716ae2afd0 0     MTA (Threadpool Worker) 
XXXX  108    0 0000027173440fa0  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
XXXX  109    0 0000027173441f40  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
XXXX  110    0 0000027173442710  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
XXXX  111    0 0000027173444e20  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
XXXX  112    0 00000271734484d0  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
XXXX  113    0 0000027173448ca0  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
XXXX  114    0 0000027173446d60  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
XXXX  115    0 0000027173447530  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
  85  116 13ec8 0000027173449470  1029220 Preemptive  000002710624CFB8:000002710624D6E8 000002716ae2afd0 0     MTA (Threadpool Worker) 
XXXX  117    0 00000271734436b0  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
XXXX  118    0 0000027173447d00  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
XXXX  119    0 000002717344dac0  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
  86  120 137a8 000002717344c350  1029220 Preemptive  0000027106258D60:00000271062596E8 000002716ae2afd0 0     MTA (Threadpool Worker) 
XXXX  121    0 000002717344d2f0  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
XXXX  122    0 0000027173326f50  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
XXXX  123    0 0000027173327ef0  1039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Worker) 
  87  124 1443c 00000271733286c0  1029220 Preemptive  000002710631AEF8:000002710631B6E8 000002716ae2afd0 0     MTA (Threadpool Worker) 
  88  125 13b98 0000027173329660  1029220 Preemptive  0000027106256958:00000271062576E8 000002716ae2afd0 0     MTA (Threadpool Worker) 
XXXX   13    0 000002717332bd70    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
XXXX  126    0 000002717332d4e0    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
XXXX  127    0 00000271733332a0    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
XXXX  128    0 0000027173331b30    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
XXXX  129    0 0000027173332300    39820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn 
XXXX    6    0 000002717332f420  8039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Completion Port) 
XXXX  131    0 000002717332e480  8039820 Preemptive  0000000000000000:0000000000000000 000002716ae2afd0 0     Ukn (Threadpool Completion Port) 
  89  130 1404c 0000027173332ad0  8029220 Preemptive  0000027106334438:00000271063356E8 000002716ae2afd0 0     MTA (Threadpool Completion Port) 
  90  132 14cbc 000002717332dcb0  8029220 Preemptive  000002710635C790:000002710635D6E8 000002716ae2afd0 0     MTA (Threadpool Completion Port) 

当我执行!syncblk时,我得到以下输出,我相信,它告诉我没有拥有任何监视器的线程:

0:002> !syncblk
Index SyncBlock MonitorHeld Recursion Owning Thread Info  SyncBlock Owner
-----------------------------
Total           351
CCW             49
RCW             15
ComClassFactory 0
Free            35

当我切换到显示锁的线程时,我看到以下内容:

0:002> ~12s
ntdll!NtWaitForMultipleObjects+0x14:
00007ffe`7b5b6c24 c3              ret

当我执行!逃跑时我有这个:

 0:000> !runaway
 User Mode Time
  Thread       Time
    0:13010     0 days 0:00:16.203
    6:e444     0 days 0:00:01.687
   81:14064     0 days 0:00:00.281
   40:1232c     0 days 0:00:00.234
   16:14b30     0 days 0:00:00.125
   32:13114     0 days 0:00:00.078
   65:fd9c     0 days 0:00:00.062
   39:14738     0 days 0:00:00.062
   67:13120     0 days 0:00:00.046
   38:f818     0 days 0:00:00.046
   54:14904     0 days 0:00:00.031
    7:14570     0 days 0:00:00.031
   87:1443c     0 days 0:00:00.015
   58:11d88     0 days 0:00:00.015
   48:14bf0     0 days 0:00:00.015
   44:60ec     0 days 0:00:00.015
   42:14d6c     0 days 0:00:00.015
   27:12580     0 days 0:00:00.015
   15:11e04     0 days 0:00:00.015
    2:106e4     0 days 0:00:00.015
   91:149e8     0 days 0:00:00.000
   90:14cbc     0 days 0:00:00.000
   89:1404c     0 days 0:00:00.000
   88:13b98     0 days 0:00:00.000
   86:137a8     0 days 0:00:00.000
   85:13ec8     0 days 0:00:00.000
   84:13848     0 days 0:00:00.000
   83:13580     0 days 0:00:00.000
   82:11fb8     0 days 0:00:00.000
   80:14938     0 days 0:00:00.000
   79:13e38     0 days 0:00:00.000
   78:12f54     0 days 0:00:00.000
   77:14d78     0 days 0:00:00.000
   76:13668     0 days 0:00:00.000
   75:13adc     0 days 0:00:00.000
   74:13dd0     0 days 0:00:00.000
   73:14690     0 days 0:00:00.000
   72:14f50     0 days 0:00:00.000
   71:148a0     0 days 0:00:00.000
   70:f42c     0 days 0:00:00.000
   69:12720     0 days 0:00:00.000
   68:147ec     0 days 0:00:00.000
   66:129a4     0 days 0:00:00.000
   64:ef34     0 days 0:00:00.000
   63:13858     0 days 0:00:00.000
   62:fd58     0 days 0:00:00.000
   61:14a94     0 days 0:00:00.000
   60:12d2c     0 days 0:00:00.000
   59:12e5c     0 days 0:00:00.000
   57:14e34     0 days 0:00:00.000
   56:14e54     0 days 0:00:00.000
   55:12920     0 days 0:00:00.000
   53:12444     0 days 0:00:00.000
   52:14574     0 days 0:00:00.000
   51:14148     0 days 0:00:00.000
   50:1467c     0 days 0:00:00.000
   49:1147c     0 days 0:00:00.000
   47:14028     0 days 0:00:00.000
   46:134cc     0 days 0:00:00.000
   45:132d8     0 days 0:00:00.000
   43:13d70     0 days 0:00:00.000
   41:14504     0 days 0:00:00.000
   37:f764     0 days 0:00:00.000
   36:13a64     0 days 0:00:00.000
   35:1391c     0 days 0:00:00.000
   34:14a38     0 days 0:00:00.000
   33:14068     0 days 0:00:00.000
   31:fde8     0 days 0:00:00.000
   30:f5b4     0 days 0:00:00.000
   29:12390     0 days 0:00:00.000
   28:14388     0 days 0:00:00.000
   26:137c4     0 days 0:00:00.000
   25:10da8     0 days 0:00:00.000
   24:13d78     0 days 0:00:00.000
   23:14a54     0 days 0:00:00.000
   22:131f8     0 days 0:00:00.000
   21:14608     0 days 0:00:00.000
   20:11278     0 days 0:00:00.000
   19:13b9c     0 days 0:00:00.000
   18:143e8     0 days 0:00:00.000
   17:14760     0 days 0:00:00.000
   14:13e34     0 days 0:00:00.000
   13:12ef8     0 days 0:00:00.000
   12:12758     0 days 0:00:00.000
   11:13e40     0 days 0:00:00.000
   10:14c54     0 days 0:00:00.000
    9:13e98     0 days 0:00:00.000
    8:7e2c     0 days 0:00:00.000
    5:14b18     0 days 0:00:00.000
    4:14a48     0 days 0:00:00.000
    3:12da4     0 days 0:00:00.000
    1:14fd8     0 days 0:00:00.000

我不是WinDbg或SOS的专家,但有人可以为我解读这个吗?我认为问题不是僵局,而是一个失控的线程。我该怎么办?我被困在这一点上。

谢谢!

c# .net debugging windbg sos
2个回答
3
投票

根据微软的docs,你在该列表中有很多前台线程,任何仍在运行的前台线程都会阻止CLR关闭,即使应用程序没有任何可见的窗口。

你可以分辨出哪些不是背景的方式是!ThreadState命令,例如:

0:000> !threadstate 2b020
    Legal to Join
    CLR Owns
    CoInitialized
    In Multi Threaded Apartment
    Fully initialized

使用State输出的!threads列中的值作为参数。

返回列表,状态为2b020或202b020的所有线程都是前台。检查他们的堆栈,将它们绑定到您在代码中创建它们的位置。

通过在创建IsBackground属性时将它们设置为true来使它们成为背景。更好的是,不要创建它们。这是一个很好的替代品清单:Background Thread? Let me count the ways....


1
投票

与C ++不同,即使主线程运行到main()方法的末尾,.NET中的线程也会默认使应用程序保持活动状态。这意味着应用程序中的所有其他线程也需要达到目的。

当然,这条规则有例外:

  • background”线程将被终止
  • 你不需要关心垃圾收集器和终结器线程
  • .NET将关心线程池线程
  • (可能是其他人)

如果你说“我知道这一切并考虑到它”,那很好。有很多XXXX线程,这是这些线程死亡的指标。如果你想让应用程序关闭,这很好。

因此剩下的线程可能存在死锁。任何同步对象都可能发生死锁,而不仅仅是lock语句。在.NET中我们有很多:

  • lock声明
  • Monitor(基本相同)
  • ReaderWriterLock
  • ReaderWriterLockSlim
  • Process
  • Thread
  • SpinLock
  • CountDownEvent
  • ...

而且,更糟糕的是,使用P / Invoke,我们也可以访问所有本机同步对象:

  • Mutex
  • Semaphore
  • Event
  • WaitableTimer
  • CriticalSection
  • Job
  • ...

问题是:所有这些同步对象使得调试死锁非常复杂。积极的一面是:你有你想要的所有时间,因为应用程序等待你分析它。

我对死锁分析的建议:

  1. Take a crash dump。许多开发人员不知道崩溃转储仍然有用,即使应用程序没有崩溃。它可以帮助您自动重启PC,例如Windows安装更新。
  2. 在.NET的情况下,运行 !dlk。它是死锁的专门命令,并考虑lock语句,MonitorReaderWriterLock和本地CriticalSection。这是一个很大的节省时间。
  3. !analyze -hang非常善于为您提供分析的起点。它通常不会弄清楚整个等待链,但一个好的起点至关重要。

如果您担心“失控”线程,那么实时应用程序要好得多。活动线程应该消耗CPU,你可以在像Process Explorer这样的工具中看到它。请执行下列操作:

  1. 如果您想立即查看好的调用堆栈,请配置符号
  2. 打开受影响的进程的属性
  3. 导航到“线程”选项卡
  4. 注意一个有很多“Cycles Delta”的主题。该工具将为您提供该线程的线程ID。

在这种情况下,您需要弄清楚如何取消线程正在处理的操作,或者显示进度条以供用户确定程序何时终止。

假设你等待超过16秒的程序终止,一个失控的线程可能不是你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.