2015-10-14 211 views
1

我得到了十幾個轉儲文件。從堆棧導航到CDB/WinDbg中的託管堆棧中的堆棧幀

0aa6ce7c 028ea126 (MethodDesc 02756288 +0x16 TheCompany.Toolbox.Log.Logger.Info(System.String)) 
0aa6cecc 028ea126 (MethodDesc 02756288 +0x16 TheCompany.Toolbox.Log.Logger.Info(System.String)) 
0aa6cf54 028ea126 (MethodDesc 02756288 +0x16 TheCompany.Toolbox.Log.Logger.Info(System.String)) 
0aa6d080 6f42bc51 (MethodDesc 6f1da670 +0x81 System.TimeSpan.TimeToTicks(Int32, Int32, Int32)) 
0aa6d0a8 6f42c0a0 (MethodDesc 6f1daf1c +0x40 System.DateTime.TimeToTicks(Int32, Int32, Int32)) 
0aa6d0d0 6f42cb8f (MethodDesc 6f1da8ec +0x7f System.DateTime.Add(Double, Int32)) 

不幸的是,試圖與!clrstack -a獲取本地變量不給我合理的結果:

0:045> !clrstack -a 
OS Thread Id: 0xf50 (45) 
Child SP  IP Call Site 
0aa6ed78 76df7094 [GCFrame: 0aa6ed78] 
0aa6ef5c 76df7094 [DebuggerU2MCatchHandlerFrame: 0aa6ef5c] 

使用的WinDbg/sosex命令!dumpstack -EE,他們中的很多被最終證明這些線有沒有辦法轉移到另一個框架比最後一個? (以便在這個框架中獲得當地人)。

在本地模式,我可以這樣做:

.frame @$.frame +1 

然後我可以在一幀當地人與

dv 

我不知道怎麼做相同的管理堆棧,因此因爲我可以在前面的幀中做!clrstack -a。我也想知道這個棧幀中的函數參數值/引用。

是否有執行此類操作的命令?

回答

3

史蒂夫約翰遜的SOSEX!mframe命令。

雖然您已經標記了問題,但您還沒有使用過任何SOSEX命令,只有SOS命令,這可能是您未找到該命令的原因。

您從!mk獲得幀編號。如果啓用了DML,則可以單擊幀號並自動完成!mframe命令。之後,您可以執行!mdv來顯示參數和當地人。

或者,!mdv <frame>也會直接取幀號。

但是,我不確定這是否總是有幫助。 SOSEX無法實現魔法,需要依賴.NET框架提供的信息。如果由於某種原因而損壞,你可能會不走運。