我正在嘗試使用windbg來研究在x64機器上爲我們的x86進程創建的掛起轉儲文件。這是一個4.0 x86的應用程序,所以只是爲了得到一個非託管堆棧,我必須做到以下幾點:SOS不支持當前目標體系結構
.loadby sos clr
.load wow64exts
!sw
kL
然而,每次我嘗試通過!clrstack
我得到錯誤的標題,以獲得託管堆棧。我錯過了什麼?
我正在嘗試使用windbg來研究在x64機器上爲我們的x86進程創建的掛起轉儲文件。這是一個4.0 x86的應用程序,所以只是爲了得到一個非託管堆棧,我必須做到以下幾點:SOS不支持當前目標體系結構
.loadby sos clr
.load wow64exts
!sw
kL
然而,每次我嘗試通過!clrstack
我得到錯誤的標題,以獲得託管堆棧。我錯過了什麼?
我相信你將不得不使用位於C:\ Windows \ SysWOW64 \ taskmgr.exe中的32位任務管理器來獲取32位轉儲。
那麼,沒有辦法使用當前的轉儲? – 2013-05-07 15:29:24
上面鏈接中的一條評論提到運行!wow64exts.sw,它可以讓你運行堆棧相關的命令,如!clrstack。我從來沒有嘗試過,因爲我已經能夠獲得新的轉儲。 – trydis 2013-05-07 15:35:37
我打算把這個開放一天左右,看看有沒有人回答說我不是我,否則我會接受這一個 – 2013-05-07 18:13:23
我一直跟着位數匹配的建議,但從來不知道究竟爲什麼,直到我偶然發現這篇文章就來了:http://blogs.msdn.com/b/dotnet/archive/2013/05/01/net-crash-dump-and-live-process-inspection.aspx其中規定:
「DAC有一個標準化的接口,調試器使用該接口來獲取關於這些抽象的狀態的信息,例如, 託管堆。使用與CLR 版本匹配的DAC以及進程或故障轉儲的體系結構您想要 檢查。「
和
「請注意,DAC是土生土長的DLL,必須下載到使用ClrMD程序 。如果轉儲或實時進程是32位的,你必須 使用32位版本的DAC,這意味着您的檢測程序也需要32位,對於 64位進程也是如此。請確保您的程序平臺與您的 相匹配正在調試。「
還有一個選項適用於我: - 我有一個64位進程崩潰轉儲。因此,首先,我需要SOS.dll和mscordacwks.dll從機器(C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319)轉儲被採取。 ! - 基於兩篇MSDN文章(http://msdn.microsoft.com/en-gb/library/windows/hardware/ff562263%28v=vs.85%29.aspx,http://msdn.microsoft.com/en-gb/library/windows/hardware/ff540665%28v=vs.85%29.aspx),我加載CLR這樣:
.cordll -u -ve -I clr -lp <path to SOS.dll & mscordacwks.dll>
在此之後,線程的工作。我認爲,同樣應該適用於32位崩潰轉儲。
正如其他人已經說過的,這可能是由64位應用程序(例如默認的任務管理器)造成的,從而創建一個32位進程的轉儲文件。
我能夠使用poizan42 on GitHub的soswow64 WinDbg擴展來解決問題。我通過this blog entry發現它,它還提供了有關該問題的更詳細信息。
我很確定這應該是現在的答案,但我可能有點偏頗;) – poizan42 2016-06-10 10:04:18
@ poizan42非常感謝soswow64,它讓我的工作變得如此簡單! – 2016-06-24 14:43:29
您是否在Windows 8計算機上運行WinDbg?我只在Windows 8機器上收到相同的錯誤信息。如果我將內存轉儲到文件中,即使我做了也不能運行SOS!wow64exts.sw切換到32位模式。但是,如果我重視過程,我可以執行SOS ... – 2013-05-09 12:44:35