使用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文件里的,可以在此找到。由于我是想检测我的代码是否存在内存泄漏问题,所以才使用这些工具的,这里有篇文章说明了这个问题,可以参考一下。有不正确的地方还需要指正啦,呵呵。


你可能感兴趣的:(Silverlight)