2017-06-14 105 views
-1

這是我第一次提出問題,而且我會承認,在用戶模式調試方面,我是一名初學者。以下是我想要做的事情:如何從!DAE獲取堆棧跟蹤的線程ID?

我已經通過使用!dae得到了例外和計數,並且我選擇了一個具有調用堆棧的例外。我想查看傳遞給這個callstack函數的參數,所以我假設我需要切換到包含這個異常的線程,並使用kb命令查看參數地址。

我已經嘗試了!threads命令,雖然它確實列出了線程,但在「例外」列下沒有顯示任何例外。

+0

!dae是舊的.net 1.1 sos.dll的舊命令。這是一個古老的.net程序嗎? – magicandre1981

回答

0

正如@magicandre1981在評論中提到的那樣,!dae是一箇舊命令,它只是列出堆中可用的異常對象。許多這些例外沒有被拋出。 (該命令是相似(可能不相同)!dumpheap -type Exception。)

我選擇了一個有一個調用堆棧

這當然是個好主意。但是,請注意,此異常可能已被捕獲並已處理或將被捕獲和處理。

我假設我需要切換到包含此異常

該命令將~#s螺紋:

  • ~:螺紋
  • #:有例外
  • s:選擇/切換到

爲了這個工作,此時必須拋出異常(繼續閱讀)。

使用kb命令

這是行不通的查看參數地址,因爲k命令用於管理堆棧設計的原生棧,沒有。對於.NET,您需要!clrstack -p。像kb一樣,這隻能用於真正的調用堆棧,而不能用於附加到異常的調用堆棧。

我已經試過!threads命令,雖然它列出了線程,但在「例外」列下沒有任何例外。

這可能意味着你很不幸,現在不會拋出異常。

下面的命令可能有助於澄清:

  • .exr -1:拿到最後一個異常。如果這給出0xE0434F4D,則引發.NET異常。如果不是,你很不幸(可能在你的情況下)。
  • !pe:打印拋出的託管異常(在您的情況不太可能)。

因爲我認爲兩者都不會給你你所期望的結果,所以問題是:你是如何以及當什麼時候進行崩潰轉儲的。如果要分析崩潰,則需要在應用程序崩潰時執行崩潰轉儲。不是之前,也不是之後。有關考慮事項,請參閱How to take a good crash dump for .NET。在你的情況下,如果你不使用未處理的異常處理程序,ProcDump-e命令行開關或WER LocalDumps似乎是合適的。