Dot-Net
無法切換到 WinDbg 中的託管執行緒
我正在使用 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 相同類型的轉儲選項(加上更多)。