2012-09-24 29 views
1

當異常發生我創建了一個小型轉儲與參數如何判斷錯誤導致墜機指令傾倒

MiniDumpNormal | MiniDumpWithProcessThreadData | MiniDumpWithThreadInfo | MiniDumpWithUnloadedModules

所需要提取管理調用堆棧(從What is minimum MINIDUMP_TYPE set to dump native C++ process that hosts .net component to be able to use !clrstack in windbg).NET應用程序。如上所述here

當在WinDbg中崩潰轉儲執行!dumpstack一個可以看到類似

ChildEBP RetAddr Caller,Callee 
... 
001dccc0 09b301a3 (MethodDesc 0x274268c +0x133 MyNameSpace.ErrorObject.FaultyMethod(Int32)) 
... 

的小型轉儲生成一個異常濾光片,如果我沒有記錯,這意味着誤差在方法FaultyMethod中的偏移量0x133處生成,其中0x133是JIT編譯的機器代碼中的偏移量。

如何將此偏移量轉換回源代碼或IL行號以識別導致異常的指令?

回答

0

如果有人有興趣,這裏是我的方法來解決這個問題。它首先將MiniDumpWithIndirectlyReferencedMemory添加到MiniDumpWriteDump呼叫。這將導致包含棧中指針引用的內存頁面。儘管MSDN聲明「此選項可以顯着增加小型轉儲文件的大小」,但在我的測試中,小型轉儲文件的大小增長不超過幾百KB。

現在,拋出異常的方法的編譯機器代碼在轉儲中可用。這意味着!u可用於WinDBG/SOS反彙編代碼。雖然這不完全是IL或源代碼,但將機器代碼指令與IL /源代碼進行匹配不應太難。 This blog post功能示例如何執行此操作。

1

您是否試過在windbg中使用SOS.dll進行調試?您可以使用CLRStack命令獲取託管代碼堆棧跟蹤。有關加載它的說明,請參閱Unable to load SOS in WinDbg。但是,正如您所說,dumpstack給出了指令抵消。

要轉換指令偏移量,一種笨拙但可行的方法是將可疑程序集加載到ILDASM中,深入到類和方法/屬性中並查看IL。指令前面有IL_XXXX,其中XXXX是方法開始處的十六進制偏移量。它不會給你確切的代碼,但它會給你更多的信息,尤其是方法調用。

+0

是的,我正在使用SOS.dll(我認爲'!dumpstack'是一個SOS命令)。 '!clrstack'實際上給了我更少的信息,因爲我只能看到callstack中的方法,而不是指令偏移量。不幸的是,參數和當地人都不可用,因爲我不能讓我充滿內存轉儲(第一次嘗試創建了一個400MB的文件...) –

+0

@paulB啊。我一直使用clrstack,所以我可以訪問當地人和參數。你每天學習新的東西。在答案中添加了關於ildasm的註釋。 – akton

+0

感謝您的輸入!我只是嘗試使用ildasm,它似乎有點棘手,因爲IL偏移量不一定匹配轉儲中的偏移量(應該指的是編譯的機器碼,我猜)。我會再玩一些windbg和ildasm,並讓你知道結果。 –

相關問題