解决Silverlight无法调试的问题
本文来自Kevin Yang博客 作者:Kevin Yang
问题描述
在Silverlight开发过程中,经常时不时的会碰到Silverlight无法调试的问题。我就遇到下面几种情况:
1. Web Application+Silverlight,F5进入调试状态之后无法跟进Silverlight程序中下的断点
2. 项目中有两个Silverlight工程,其中一个Silverlight程序中有一个鼠标点击事件会将当前页面导航到另外一个Silverlight程序的承载页面。第一个Silverlight程序断点正常,但是第二个Silverlight程序中的断点不能自动停下来
3. 无论是在TestPage模式下调试还是在Web工程上调试,只要打开了Silverlight调试开关,那么启动的时候会提示“Unable to start debugging. Cannot locate Microsoft Internet Explorer”。如果你是直接Ctrl+F5运行,有时候也会出现一样的问题。
单个Silverlight工程无法调试
对于第一个问题,请检查如下设置是否正确:
1. 确认启用了Silverlight调试。双击Asp.Net工程中的属性文件夹打开属性设置页,找到Web一栏,在此页卡的最下面有几个调试选项,如下图所示:
确认最后一项“Silverlight”之前的勾是勾上的。
2. 确保浏览器访问的Xap包是最新的。检查IE是否已经清除了缓存,或者ClientBin中的Xap因为某些原因没能更新(如因配置管理导致无法覆盖)
3. 检查Asp.Net工程是否绑定了Silverlight应用。可以通过asp.net工程的属性面板中的Silverlight Application页卡查看是否绑定成功。如下:
4. 检查Silverlight工程的StartupObject是否设置正确。有时候我们对工程的命名空间进行重命名,会导致Silverlight应用程序的入口对象失效,从而导致无法启动等情况。
IE8下无法同时调试多个Silverlight工程?!
IE8和以往的IE不大一样,它的多标签是采用多进程的方式来实现的。整个窗口是一个框架进程,每个Tab标签页是一个独立的子进程(实际上,IE8会根据内存动态控制Tab进程的数目,因此多个标签页可能会共存于同一个进程之中)。当你尝试在多个标签页中打开不同的Silverlight应用程序时,例如从SilverlightApplication1中打开新页面到SilverlightApplication2页面,这个时候你会发现,SilverlightApplication2应用程序无法调试。
这是因为,Visual Studio除了启动窗口进程之外,不会自动帮我们Attach其他的包含Silverlight应用程序的进程,如果我们需要在多个标签页(或者多个窗口)中同时调试不同的Silverlight应用程序,那么我们必须自己手动Attach这些进程。
举个简单的例子,我有两个Silverlight工程,其中SilverlightApplication1中包含链接指向SilverlightApplication2页面,点击链接会在新标签页中打开SilverlightApplication2的承载页面。
为了Attach相应的进程,首先我们需要找到SilverlightApplication2承载页面对应的进程。打开ProcessExplorer,我们可以看到三个进程。
其中的ID为4528的是父进程,也就是框架进程,用于管理不同的标签进程之间的通信等事务。5160和5248分别对应着两个标签页进程。至于哪个对应哪个我们在这里无法根据进程号确定。
我们再打开Visual Studio中的Attach窗口(菜单=>Debug=>Attach to process…)
这里列出了所有系统可用的进程清单,我们可以看到三个IE进程,其中一个是灰色的,这表示了这个进程已经被Attach到Visual Studio的调试器上了。排除了框架进程4258外,就剩下5248这个进程了,这个进程就是我们要找的SilverlightApplication2对应的承载页面的进程了。选中之后Attach到调试器上,我们发现,SilverlightApplication2中的断点还是显示为空心红圈,依然无法调试。
这是因为我们指定的进程代码类型不正确。我们注意到,上图中最上面有一个Attach to,后面显示的是Automatic,这个代表着Visual Studio的调试器会自动帮我们选择进程的调试类型,例如是托管代码调试,还是脚本调试,等等。我们选中5248这个进程,发现Visual Studio给我们选择的方式是脚本调试。
在Visual Studio中,脚本调试和Silverlight调试是不能共存的,这也就是为什么有时候你按下F5的时候,Visual Studio会提示你,调试Silverlight程序会暂时关闭脚本调试的功能。因此在脚本调试下,我们无法跟进Silverlight应用程序的断点。
这里额外说一点,IE8高级选项中的禁用脚本调试设置对Visual Studio一点影响都没有,因为Visual Studio 2008在调试器启动的时候会自动启用脚本调试(可以通过注册表禁用此特性),除非在Web Application属性中打开了Silverlight调试。
回到刚才的问题,由于Visual Studio帮我们自动选择的调试类型有误,导致我们无法调试SilverlightApplication2,因此我们需要手动指定Attach类型。点击Attach to后侧的select按钮。
在弹出的选择代码类型窗口中勾选上Silverlight。确定之后再次Attach,我们发现,这一次,断点真的起作用了。
当然,如果这种方式比较麻烦的话,我们也可以通过改变IE8的Tab进程创建方式来让不同标签页共存于一个进程中。在注册表HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/Main下面有一个TabProcGrowth键值(DWORD类型),当其设置为0时, IE框架和Tab工作在一个进程里面,Tab采用线程的方式创建,同时IE的保护模式(Protect Mode)会关闭。TabProcGrowth=1时IE框架和Tab工作在不同的进程里面。TabProcGrowth>1时,此值将决定IE8最多创建的Tab进程数目。如果TabProcGrowth 不存在,则会根据可用的物理内存数量决定Tab进程的数量。
调试时无法打开IE窗口的问题
这个问题是我最近才遇到的,我也不知道为什么突然之间,我的Silverlight工程按下F5的时候无法调试,弹出下面这个对话框:Unable to start debugging. Cannot locate Microsoft Internet Explorer.
如果直接运行,那么能够打开,但是打开之后Visual Studio还是会弹出一样的错误。
这个问题折腾了我半天,我尝试了重启电脑,重装Silverlight Tools,新建干净的测试工程,修改系统和Visual Studio的默认浏览器(注意,系统和Visual Studio的默认浏览器是独立设置的)均以失败告终。Google了很久,Silverlight官方论坛上倒是有不少帖子和这个相关的,但我细细看了之后发现没有一个回帖能够解决我的问题的。有个发帖的家伙问题是解决了,但是不把怎么解决的说一下就跑了,强烈bs一下这种人!
话说回来,我最后是怎么解决这个问题的呢,是用了Process Monitor这个小工具(微软Sysinternal荣誉出品!)。之前有一次asp.net网站的GlobalError里头出现了一个“文件不存在”的HTTPException,查了半天没查出来,后来使用这个工具监视了一下WebDevServ.exe进程之后发现该进程尝试去访问某个不存在的文件。
Process Monitor,可以监控当前系统中所有进程的活动,包括对文件系统的操作,读写注册表,网络访问以及线程活动等等,非常实用的调试维护工具。
我打开这个工具,选择监视进程为devenv.exe。在Visual Studio中F5开始调试,立即弹出出错对话框,OK,把PM暂停一下,否则条目太多了。
但是事件条目还是太多了,所以我把Result为SUCCESS的条目过滤掉,因为我们只关注那些失败的条目。
然后对日志条目进行细致的排查,终于发现了问题根源:
原来Visual Studio在调试或者运行的时候会去读取注册表中的HKLM/Software/Microsoft/Windows/CurrentVersion/App Paths/iexplore.exe项,然后读取不到,因而才报那个错误。难怪提示Cannot locate Microsoft internet explorer呢。
我打开regedit注册表编辑器,找到这个路径,然后把缺失的项加上去,重新回到Visual Studio中F5,终于可以了,内牛满面~
希望我的解决方法能够给你一些启发,以后遇到类似莫名其妙的问题,可以想到使用PM这个工具去排查问题。
update: 更新了新的症状(F5调试的时候弹出cannot locate microsoft internet explorer的对话框)的解决办法。
分享到:
相关推荐
Silverlight无法启动调试解决方案,自己测试总结的。
Visual Studio 2012,程序无法启动调试,需要安装最新版本的Silverlight的解决方式, Silverlight4和Silverlight5 的合并安装包
为解决此问题,需要添加如下三个引用,参考文章:http://www.cnblogs.com/Blackie/archive/2009/07/09/1520080.html 1.System.Runtime.Serialization 2.System.ServiceModel 3.System.ServiceModel.Web 至此,一个...
安装Silverlight_Developer即可解决visual studio 2010不能调试Silverlight4.0.50524.0的问题;本人亲自测试通过;
作为一个程序员,解BUG是我们工作中常做的工作,甚至可以说解决问题能力是一个人工作能力的重要体现。因为这体现了一个程序员的技术水平、技术深度、经验等等。 那么在我们解决BUG的过程中,定位问题是非常重要的。...
vs2010是一个集成环境,它简化了有关创建、调试和部署应用程序的基本任务。借助于 Visual Studio 2010 ...对测试先行的开发的集成支持和新的调试工具可让您快速查找和修复所有 bug,并有助于确保实现高质量解决方案。
通常,我们在使用nodejs发送http请求时,一旦遇到404响应,nodejs内部...经过调试发现,是由于底图加载请求超时的缘故,和nodejs一样,silverlight一直在进行请求直到超出它自己设定的响应时限。 于是,我当时正好有业
提示信息太少,盲目怀疑程序哪里写的不对,只会使问题变得更糟,拖延了解决问题的时间。 异常排查 此时我们应该查看是哪一个请求引起的错误,方法就是使用浏览器的开发者工具:IE8以上按f12,chrome按下ctrl+shift+I...
2.2.1 解决方案资源管理器 2.2.2 文档窗口 2.2.3 工具箱 2.2.4 错误列表和任务列表 2.2.5 服务器资源管理器 2.3 代码编辑器 2.3.1 添加程序集引用 2.3.2 智能感知和大纲显示 2.3.3 Visual Studio ...
* 单键运行方法、类、命名空间、项目和解决方案中的单元测试 * 以ad-hoc测试的形式快速评测方法或属性 * 跳到.NET Reflector中的任何方法、类型、项目或引用 * 在调试过程中可以查看.NET Reflector中的任何模块...
WebAssembly和Blazor:解决了一个存在十年的老问题 WebAssembly 是一种新的客户端技术,可以在所有现代浏览器(包括移动浏览器)中实现近乎原生的性能,而且不需要插件。 许多语言,包括 C、C#、Go 和 Rust,都...
6.1 visual studio 2010 team system的新增内容:历史调试 267 6.2 与visual basic 6兼容的注意事项 268 6.3 .net中的异常处理 268 6.4 结构化异常处理的关键字 269 6.4.1 try、catch和finally关键字 270 ...
本书主要介绍了如何在VB解决方案中使用Microsoft提供的最新、最强大的工具,探讨了LINQ、AJAX、新的Visual Studio版本等,使读者能把这些功能应用于自己目前要完成的工作。本书的内容还包括.NET Framework、部署...
· 使用线程池、任务、取消、计时器和异步I/O操作来设计响应性强、稳定性高和伸缩性大的解决方案 · 借助于异常处理来进行状态管理 · 使用CLR寄宿、AppDomain、程序集加载、反射和C#的dynamic类型来构造具有动态...
1.2.5 Silverlight 14 1.3 总结 15 第2章 Visual Studio 16 2.1 Visual Studio 16 2.1.1 网站和Web项目 17 2.1.2 创建无项目文件的网站 18 2.1.3 设计网页 21 2.2 Visual StudioIDE 26 2.2.1 解决...
本书主要介绍了如何在VB解决方案中使用Microsoft提供的最新、最强大的工具,探讨了LINQ、AJAX、新的Visual Studio版本等,使读者能把这些功能应用于自己目前要完成的工作。本书的内容还包括.NET Framework、部署...
本书主要介绍了如何在VB解决方案中使用Microsoft提供的最新、最强大的工具,探讨了LINQ、AJAX、新的Visual Studio版本等,使读者能把这些功能应用于自己目前要完成的工作。本书的内容还包括.NET Framework、部署...
本书主要介绍了如何在VB解决方案中使用Microsoft提供的最新、最强大的工具,探讨了LINQ、AJAX、新的Visual Studio版本等,使读者能把这些功能应用于自己目前要完成的工作。本书的内容还包括.NET Framework、部署...
本书主要介绍了如何在VB解决方案中使用Microsoft提供的最新、最强大的工具,探讨了LINQ、AJAX、新的Visual Studio版本等,使读者能把这些功能应用于自己目前要完成的工作。本书的内容还包括.NET Framework、部署...