當異常發生我創建了一個小型轉儲與參數如何判斷錯誤導致墜機指令傾倒
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行號以識別導致異常的指令?
是的,我正在使用SOS.dll(我認爲'!dumpstack'是一個SOS命令)。 '!clrstack'實際上給了我更少的信息,因爲我只能看到callstack中的方法,而不是指令偏移量。不幸的是,參數和當地人都不可用,因爲我不能讓我充滿內存轉儲(第一次嘗試創建了一個400MB的文件...) –
@paulB啊。我一直使用clrstack,所以我可以訪問當地人和參數。你每天學習新的東西。在答案中添加了關於ildasm的註釋。 – akton
感謝您的輸入!我只是嘗試使用ildasm,它似乎有點棘手,因爲IL偏移量不一定匹配轉儲中的偏移量(應該指的是編譯的機器碼,我猜)。我會再玩一些windbg和ildasm,並讓你知道結果。 –