Dot-Net

無法切換到 WinDbg 中的託管執行緒

  • July 11, 2012

我正在使用 SOS 探索一個帶有 WinDbg 的 ASP.NET 程序的小型轉儲。如果我列出託管執行緒,我會看到一個正常的執行緒列表:

0:000> !threads
ThreadCount: 8
UnstartedThread: 0
BackgroundThread: 8
PendingThread: 0
DeadThread: 0
Hosted Runtime: no
                                             PreEmptive                                                Lock
      ID OSID        ThreadOBJ     State   GC     GC Alloc Context                  Domain           Count APT Exception
XXXX    1 12bc 00000000001441f0   1808220 Disabled 0000000140b10fc8:0000000140b12f20 000000000017f6e0     0 Ukn (Threadpool Worker)
XXXX    2 1334 0000000000152f90      b220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Finalizer)
XXXX    3 138c 000000000017b100    80a220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Threadpool Completion Port)
XXXX    4  81c 000000000017eb40      1220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn
XXXX    5  5e4 00000000001bccd0   880a220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Threadpool Completion Port)
XXXX    6 11e4 0000000004bee280   180b220 Disabled 0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Threadpool Worker)
XXXX    7  73c 0000000004c267e0   180b220 Disabled 0000000140b0f158:0000000140b10f20 000000000017f6e0     3 Ukn (Threadpool Worker) System.StackOverflowException (000000007fff0138) (nested exceptions)
XXXX    8  21c 00000000001ad1c0   180b220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Threadpool Worker)

但是,如果我嘗試切換到執行緒 7(有例外的執行緒),我會得到:

0:000> ~7s
       ^ Illegal thread error in '~7s'

嘗試切換到任何託管執行緒時會發生這種情況。我不知道從哪裡開始。我真正需要做的是查看該託管執行緒的堆棧跟踪。

輸出!threads顯示執行緒的三個不同 ID(WinDbg 的 ID、託管 ID 和本機 ID)。您需要使用的是最左邊的。如您所見,轉儲中的所有執行緒都被標記為XXXX它們不再可用。這是正常的,但我確實覺得奇怪的是所有執行緒都被標記為這樣。程序關閉期間是否進行了轉儲?

更新基於評論

您絕對應該能夠使用 獲得有用的轉儲adplus -crash,但顯然這裡的一切都有些混亂,因為即使是終結器執行緒也被終止。我注意到其中一個執行緒有一個 StackoverflowException,這可能是你所追求的。要做到這一點,您可以在第一次機會異常上創建轉儲,看看您是否能以這種方式獲得更有用的東西。Adplus 對此有一個FullOnFirst標誌。

附加更新

好吧,這奇怪。其他幾件事要嘗試。

  • 附加到崩潰前的程序,讓它g。這應該會在異常情況下進入調試器。如果需要,您可以設置一個事件以將任何異常列印到控制台。使用sxe -c "!pe; !clrstack; gn" clr.
  • Adplus 曾經是一個 vbs 腳本,但不久前它被重寫為執行檔。我已經看到新版本的一些小問題,但沒有這樣的。您可以嘗試舊腳本,它仍然可以作為 adplus_old.vbs 使用。
  • 從 sysinternals嘗試procdump 。它支持與 Adplus 相同類型的轉儲選項(加上更多)。

引用自:https://stackoverflow.com/questions/11416313