這是我第一次提出問題,而且我會承認,在用戶模式調試方面,我是一名初學者。以下是我想要做的事情:如何從!DAE獲取堆棧跟蹤的線程ID?
我已經通過使用!dae
得到了例外和計數,並且我選擇了一個具有調用堆棧的例外。我想查看傳遞給這個callstack函數的參數,所以我假設我需要切換到包含這個異常的線程,並使用kb
命令查看參數地址。
我已經嘗試了!threads
命令,雖然它確實列出了線程,但在「例外」列下沒有顯示任何例外。
這是我第一次提出問題,而且我會承認,在用戶模式調試方面,我是一名初學者。以下是我想要做的事情:如何從!DAE獲取堆棧跟蹤的線程ID?
我已經通過使用!dae
得到了例外和計數,並且我選擇了一個具有調用堆棧的例外。我想查看傳遞給這個callstack函數的參數,所以我假設我需要切換到包含這個異常的線程,並使用kb
命令查看參數地址。
我已經嘗試了!threads
命令,雖然它確實列出了線程,但在「例外」列下沒有顯示任何例外。
正如@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似乎是合適的。
!dae是舊的.net 1.1 sos.dll的舊命令。這是一個古老的.net程序嗎? – magicandre1981