Silverlight 之 断点调试
silverlight程序经常会遇到无法调试的情况,下面来总结解决方案。
一、问题描述
在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运行,有时候也会出现一样的问题。
1. 单个Silverlight工程无法调试
对于第一个问题,请检查如下设置是否正确:
(1) 确认启用了Silverlight调试。打开属性设置页,找到" Web ",在此页卡的最下面找到 " 调试器 ",如下图,确认" Silverlight "已勾选:
(2) 确保浏览器访问的Xap包是最新编译出来的。最简单的办法是强制ReBuild整个Silverlight工程,清空缓存。如果不行再检查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窗口(菜单 → 调试 → 附加到进程(P)...)
这里列出了所有系统可用的进程清单,我们可以看到三个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还是会弹出一样的错误。
话说回来,我最后是怎么解决这个问题的呢,是用了 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,解决了。。。
四、调试浏览器
1. Chrome 下无法调试
发现vs中的浏览方式设置为ie,那么silverlight程序可以直接命中断点.如果vs中浏览方式设置为 chorme ,调试silverlight程序的时候必须手动附加调试器到chorme进程,否则断点无法命中.调试->附加到进程->进程列表中选中chorme进程(类型中标有silverlight x86的就是)->点击附加,刷新一下chorme页面,断点就能命中了。
chorme每次启动调试的时候都需要手动附加调试器,比较麻烦,建议调试silverlight程序的时候,使用 IE 浏览器。
2. FireFox 下无法调试
由Firefox浏览器地址栏进入about:config;
修改 dom.ipc.plugins.enabled.dll,把它由true改成false,重启Firefox就可以调试了。
Silverlight 之 断点调试的更多相关文章
- PhpStorm集成xdebug进行断点调试
本文介绍如何使用PhpStorm集成xdebug在本地开发环境进行断点调试的技巧. 我配置的环境是:Windows10 + PhpStorm10.0.1 + PHP5.6. 1. 下载xdebug的扩 ...
- PyCharm断点调试django
我在用PyCharm开发django程序的时候,对于打印日志调试程序的方式感觉还是有点麻烦和不直观,所以研究了一下断点调试的方法如下: 1.打开你的工程,在菜单栏里找到Run-->Edit Co ...
- netbeans-xdebug 断点调试php
来自NetBeans官网的帮助文档: https://netbeans.org/kb/docs/php/debugging_zh_CN.html 但具体问题,我们还是要说下 准备工作 本地部署的ser ...
- Drools mvel方言drl断点调试方法
开发环境:myeclipse2014, jdk1.8.0.91,drools6.4.0.Final, drools-eclipse-plugin,mvel2-2.2.6.Final问题描述:drl使 ...
- Eclipse断点调试
转自:http://blog.csdn.net/maritimesun/article/details/7815903 作为开发人员,掌握开发环境下的调试技巧十分有必要.去年就想把关于Eclipse断 ...
- js断点调试心得
虽然网上已经有多的数不清的调试教程了,但仍然没有发现哪篇文章写的通俗易懂,索性自己尝试写写自己的一些使用习惯或者说是心得,希望对那些还不是很懂得使用断点调试的孩子有一些帮助(大神请无视~). 1.断点 ...
- chrome developer tool—— 断点调试篇
断点,调试器的功能之一,可以让程序中断在需要的地方,从而方便其分析.也可以在一次调试中设置断点,下一次只需让程序自动运行到设置断点位置,便可在上次设置断点的位置中断下来,极大的方便了操作,同时节省了时 ...
- .NET C#微信公众号开发远程断点调试(本地远程调试生产环境代码)
最近在做微信公众号开发,由于之前没有接触过,突然发现调试不方便,不方便进行断点跟踪调试.因为微信那边绑定的服务器地址必须是公网地址,但是还是想进行断点调试(毕竟这样太方便了,程序有Bug,一步步断点跟 ...
- chrome断点调试
chrome断点调试 在编写JavaScript代码时,如果出现了bug,就要不断的去找错误,如果console控制台中提示还好说,可是没有提示恐怕就要费一番周折了.但是有了chrome这个浏览器,我 ...
随机推荐
- Jmeter实现对mysql的增、删、改、查
1. 创建一个存储过程,语句如下: DELIMITER $$; DROP PROCEDURE IF EXISTS test; create PROCEDURE test() BEGI ...
- Git_解决冲突
人生不如意之事十之八九,合并分支往往也不是一帆风顺的. 准备新的feature1分支,继续我们的新分支开发: $ git checkout -b feature1 Switched to a new ...
- CentOS 7编译openssl
# 编译安装zlib库wget http://zlib.net/zlib-1.2.11.tar.gztar -zxvf zlib-1.2.11.tar.gz cd zlib-1.2.11 ./conf ...
- OPC Server开发的几大境界
OPC server的开发相对OPC client 更加困难,OPC server 的开发主要应用COM技术,主要应用书籍为潘爱民写的<COM入门和应用>,大量的技术有很大的可重用性,在开 ...
- MVC文件上传08-使用客户端jQuery-File-Upload插件和服务端Backload组件让每个用户有专属文件夹
当需要为每个用户建立一个专属上传文件夹的时候,可以在提交文件的视图中添加一个隐藏域,并设置name="objectContext". 相关兄弟篇: MVC文件上传01-使用jque ...
- 演示Microsoft Advertising SDK for Windows Phone 8.1
演示Microsoft Advertising SDK for Windows Phone 8.1,Only for Windows Phone 8.1 1.在References上点右键,添加引用, ...
- CVS环境搭建
1.下载cvsnt(可以从附件中下载) 2.安装cvsnt 直接双击运行cvsnt安装文件,安装过程中可以选择以经典.自定义和完全三种方式安装,在自定义方式中可以选择安装路径.安装完成后,在控 ...
- Velocity中的ComparisonDateTool、MathTool、NumberT...
Velocity中的ComparisonDateTool.MathTool.NumberTool.SortTool.EscapeTool工具 可以从Apache官方网站自带的例子中查找,位置\velo ...
- ubuntu下如何查看自己的外网IP
1.1 安装使用curl命令实现 sudo apt-get install curl1.2 输入命令 curl ifconfig.me
- Spring3数据源的6种配置方法
在Spring3中,配置DataSource的方法有五种. 第一种:beans.xml <bean id="dataSource" class="org.apach ...