2013-05-07 91 views
16

我正在嘗試使用windbg來研究在x64機器上爲我們的x86進程創建的掛起轉儲文件。這是一個4.0 x86的應用程序,所以只是爲了得到一個非託管堆棧,我必須做到以下幾點:SOS不支持當前目標體系結構

.loadby sos clr 
.load wow64exts 
!sw 
kL 

然而,每次我嘗試通過!clrstack我得到錯誤的標題,以獲得託管堆棧。我錯過了什麼?

+0

您是否在Windows 8計算機上運行WinDbg?我只在Windows 8機器上收到相同的錯誤信息。如果我將內存轉儲到文件中,即使我做了也不能運行SOS!wow64exts.sw切換到32位模式。但是,如果我重視過程,我可以執行SOS ... – 2013-05-09 12:44:35

回答

22

我相信你將不得不使用位於C:\ Windows \ SysWOW64 \ taskmgr.exe中的32位任務管理器來獲取32位轉儲。

此處瞭解詳情:http://blogs.msdn.com/b/tess/archive/2010/09/29/capturing-memory-dumps-for-32-bit-processes-on-an-x64-machine.aspx

+0

那麼,沒有辦法使用當前的轉儲? – 2013-05-07 15:29:24

+0

上面鏈接中的一條評論提到運行!wow64exts.sw,它可以讓你運行堆棧相關的命令,如!clrstack。我從來沒有嘗試過,因爲我已經能夠獲得新的轉儲。 – trydis 2013-05-07 15:35:37

+0

我打算把這個開放一天左右,看看有沒有人回答說我不是我,否則我會接受這一個 – 2013-05-07 18:13:23

5

我一直跟着位數匹配的建議,但從來不知道究竟爲什麼,直到我偶然發現這篇文章就來了: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位進程也是如此。請確保您的程序平臺與您的 相匹配正在調試。「

2

還有一個選項適用於我: - 我有一個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.aspxhttp://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位崩潰轉儲。

8

正如其他人已經說過的,這可能是由64位應用程序(例如默認的任務管理器)造成的,從而創建一個32位進程的轉儲文件。

我能夠使用poizan42 on GitHub的soswow64 WinDbg擴展來解決問題。我通過this blog entry發現它,它還提供了有關該問題的更詳細信息。

+0

我很確定這應該是現在的答案,但我可能有點偏頗;) – poizan42 2016-06-10 10:04:18

+0

@ poizan42非常感謝soswow64,它讓我的工作變得如此簡單! – 2016-06-24 14:43:29