使用WinDbg調試Silverlight中遇到“Failed to find runtime DLL (clr.dll), 0x80004005”問題的解決方法之一

  這個問題主要和我的自以爲是有關,呵呵,希望大家多實踐而不是像我那樣自以爲是就好了。

  進入正題啦。從網上的有關WinDbg調試Silverlight教程中都沒有提到會發生這個錯誤,所以我也就在這個問題上止步了。

先看看截圖,我使用Vs 2010運行了一個Silverlight項目,這裏注意不是“啓動調試(F5)”,而是使用"開始執行不調試(Ctrl + F5)"。這時候默認會打開IE並導航到起始頁面。

下一步就需要使用一個工具(Process Explorer)啦,我就是在這裏栽跟頭啦,呵呵,慚愧啊,稍後會說明一下。下載並安裝好這個工具後,呵呵,其實不用安裝的,就是一個解壓包啦。運行此工具的截圖如下:

由於第一次並不會顯示Dll信息面板,所以需要點擊上圖所示的圖標,然後會看到下面截圖:

  

  在這裏你需要做的是,確定哪個iexplore.exe是需要調試的,這裏使用的是IE8,默認是使用Tab頁方式瀏覽網頁,因此這裏會出現幾個iexplore.exe。當選中上面的一個iexplore.exe時,下面會顯示對應的iexplore.exe加載的Dll文件列表,上圖是我選中PID爲6012的iexplore.exe時所顯示的Dll文件列表,不知道大家是否看到我在下面標上紅框的地方了呀?就是coreclr.dll的文件,如果存在這個文件的iexplore.exe就是我們要調試的Silverlight應用,這裏只需記住PID值就行啦,然後關閉上面的工具。

繼續我的調試,打開WinDbg(下載地址),我這裏使用的是6.11.0001.404版本。然後點擊菜單[File]->[Attach to a Process...],彈出Attach to Process窗口,如下圖所示:

  

  這裏我們選中6012的iexplore.exe,它就是我們之前記下的那個進程;可能有人會問,iexplore.exe下面不是有說明嗎?爲什麼還用之前的Process Exploer呢?

  這也正是我得到標題錯誤的原因啦。看看兩個iexplore.exe下面的說明吧。

  4552的進程說明顯示了我正要調試的那個地址,而6012的進程說明似乎與我的調試無關,呵呵,就是這個錯誤認識導致我加載sos.dll文件後卻無法顯示堆上的信息。結果如下:

  

  因此需要附加到正確的調試進程上,才能避免這個錯誤“Failed to find runtime DLL (clr.dll), 0x80004005”。

  當我附加到6012進程上後就得到了正確的結果是:

  

  由於我對於WinDbg的命令不是很瞭解,處於學習之中,所以請參考WinDbg自帶的Help文檔吧。但是在調試Silverlight應用時需要加載sos.dll文件,它的默認位置就在C:\Program Files\Microsoft Silverlight\4.1.10329.0\下。之後你就可以查看託管代碼堆上的狀態信息,例如使用!dumpheap -stat -type <你的類型名稱>,即可查看這個類型下的狀態信息了,這些命令都屬於Sos.dll文件裏的,可以在此找到。由於我是想檢測我的代碼是否存在內存泄漏問題,所以才使用這些工具的,這裏有篇文章說明了這個問題,可以參考一下。有不正確的地方還需要指正啦,呵呵。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章