昨天看一个silverlight项目,想跟进去看看,但是设置的断点死活进不去。也不知道什么原因,问别人,都说,设置了断点,启动调试就可以进入。我却不可以。真是邪门,还以为莫非我的人品又出了问题?

     可能是哪里需要配置一下?今天又到网上搜,终于被我找到了!很简单啊,就是在启动项目的属性一栏里,在silverlight调试前面的复选框上打个勾,就行了。

    但是原文讲了很多,我就全部摘抄下来吧,以备后需。

 注意:要把Silverlight.Web项目设为启动项,要把Silverlight.Web项目里的页面设为起始页。

 在安装完Silverlight_Tool后我们就拥有了Silverlight调试器。但默认网站的调试器是Asp.Net调试器,如果不更换那么Silverlight中的断点可能永远不会命中。并且在VS中显示为不会命中断点。如下图

  在网站的属性中选择上Silverlight调试器可以解决这个问题

(位置:在silverlight的载体项目上,右击属性---->Web/调试器/选上silverlight就可以了)
source from:http://www.cnblogs.com/amar-yao/archive/2009/05/08/1452852.html

创建一个程序的过程中调试环节是必不可少的步骤,而且是相当重要的。在Silverlight的开发过程中,我们主要用Silverlight Tools for Visual Studio 2008来对Silverlight应用程序进行调试。Silverlight Tools支持大多数托管调试功能。但是,它不支持“编辑并继续”、实时调试和混合模式调试。安装Silverlight Tools后,可以像调试任何其他项目类型那样来调试Silverlight项目。按F5后,Visual Studio将在默认的浏览器中启动您的应用程序,并附加调试器。然后,您可以执行常见任务,例如设置断点和检查调用堆栈。

  1 将调试器附加到 Silverlight 进程

  安装Silverlight Tools后,还可以将调试器附加到任意本地进程(前提是该进程是在受支持的浏览器中运行基于Silverlight的应用程序)。"附加到进程"对话框(在“调试”菜单上)列出了在"类型"列中标有“Silverlight”的那些进程。若要调试Silverlight代码,请使用"附加到"的默认值“Silverlight”来附加到浏览器进程。请注意,可以使用"附加到"的值"脚本"来在宿主网页中调试 JavaScript 代码。但是,不能同时调试Silverlight代码和JavaScript代码。

  2 将调试器附加到远程Mac进程

  您还可以将调试器附加到一个远程Mac浏览器进程(前提是该进程运行基于Silverlight的应用程序)。此操作要求在两台计算机上都要执行一些额外的配置步骤,并且仅在运行 Windows 的计算机和 Mac计算机之间支持此操作。另外,当调试远程进程时,“反汇编”和“寄存器”窗口不可用。

  3 Silverlight调试API

  用于实现Silverlight托管代码调试的本机API是ICorDebug Interface(ICorDebug 接口)。虽然 Silverlight会添加一些新的API,但该API还可用于实现使用完整 .NET Framework的托管应用程序的调试器。这意味着,您可以将现有托管代码调试器扩展为支持Silverlight,而无需使用大量新代码。

  4 在Silverlight项目中调试JavaScript

  在Visual Studio中,可以在托管 Silverlight 代码设置断点,也可以在宿主网页中的JavaScript代码中设置断点。但是,如本主题前面所述,不能同时调试 Silverlight 代码和JavaScript代码。若要使用Internet Explorer调试JavaScript,首先必须将浏览器配置为启用脚本调试。在Internet Explorer的“工具”菜单上,选择“Internet 选项”。然后,在“高级”选项卡上,执行以下操作:
清除“禁用脚本调试(Internet Explorer)”复选框 清除“禁用脚本调试(其他)”复选框。 选中“显示每个脚本错误的通知”复选框。 清除“显示友好 HTTP 错误消息”复选框。
  当您使用F5调试基于Silverlight的应用程序时,Visual Studio默认情况下将附加Silverlight调试器。JavaScript断点将显示一个工具提示,其消息为“当前不会命中断点。还没有为该文档加载任何符号。可以用下列两种方法之一调试JavaScript代码:
使用Ctrl+F5启动您的应用程序,而不启动调试器。然后可以按照本主题前面所述,使用"脚本"代码类型将调试器附加到浏览器进程。附加调试器后,可以刷新浏览器以重新加载Silverlight插件。该插件是调试应用程序启动代码所必需的。 如果解决方案中包含Web项目,请禁用Silverlight调试器。在Visual Studio中,选择该Web项目,然后在”项目“菜单上,选择项目名称"属性"。接下来,在“Web”选项卡中的“调试器”部分,清除“Silverlight”复选框。然后,可以使用 F5 在不附加脚本调试器的情况下启动您的应用程序。
  如果附加了脚本调试器,将禁用托管Silverlight代码中的断点。在安装完Silverlight_Tool后我们就拥有了Silverlight调试器。但默认网站的调试器是Asp.Net调试器,如果不更换那么Silverlight中的断点可能永远不会命中。并且在VS中显示为不会命中断点。如下图



  在网站的属性中选择上Silverlight调试器可以解决这个问题


 

  了解过基础的配置之后,我们来看一个例子:



  在 Mac上设置远程调试。Mac上的Silverlight远程调试由以下部分组成:

  Visual Studio 2008的一个加载项,它以传输选项的形式提供Silverlight远程调试。该加载项作为Silverlight Tools for Visual Studio 2008的一部分安装。

  在Mac上运行的一个代理服务,可帮助远程调试器识别运行Silverlight应用程序的本地进程。它作为Macintosh的Silverlight Developer运行时的一部分安装。

  远程调试是通过调试器和目标计算机之间的SSL加密TCP通道进行的。必须在Mac计算机和Windows 计算机上都执行初始配置,才能设置TCP端口以及私钥/公钥对。下面的演练说明如何将计算机配置用于调试以及如何在Visual Studio 2008中启动调试会话。

  需要以下组件来完成本演练:

  • 运行Windows的计算机,其上安装有Visual Studio 2008 SP1和Silverlight Tools for Visual Studio 2008。

  • 安装有Silverlight Developer运行时的Mac计算机。

  • 这两台计算机都连接到网络。

  • 可通过某种方法在Windows和Mac计算机之间传输文件。

  设置远程调试

  首先,必须在Mac计算机上配置远程调试代理。

  配置Mac计算机

  1 从 /Applications目录运行“Silverlight 调试配置”应用程序。

  2 单击“生成新配置”按钮。

  这样可产生以下效果:

  • “网络端口(TCP IPv4)”字段中填入了一个随机生成的介于49152和65535之间的端口号。

  • 创建一个每用户配置目录 ~/Library/Application Support/SilverlightDebuggingConfig1.0/,其中包含以下文件:Certificate.dat、PrivateKey.dat 和 Settings.dat。

  • 创建每用户启动代理 ~/Library/LaunchAgents/com.microsoft.silverlight.debugproxy.plist。

  3 在“加密密码”文本框中指定一个8到25个字符的密码,然后将它复制到“验证密码”文本框中。

  4 在“复制器路径”文本框中,为PC配置指定一个路径和.exe文件名,或者接受默认值。

  5 单击“生成PC配置”按钮。

  将弹出一个对话框,要求确认是否在第4步中指定的位置创建PC配置.exe文件。如果运行Windows 的计算机将用来调试Mac计算机上的Silverlight,则可以将该文件与此计算机配合使用。若需要,还可以重新生成该文件,方法是重新运行“Silverlight调试配置”应用程序,并从第 4 步开始执行上述过程。

  Mac计算机此时即配置完毕,可用于远程调试。接下来,将使用生成的.exe文件配置运行 Windows 的计算机。

  配置运行Windows的计算机

  1 关闭所有打开的Visual Studio实例。

  2 将在前面的过程中创建的.exe文件复制到运行Windows的计算机。

  3 运行此.exe文件。

  4 输入在前面的过程中指定的密码。

  5 在指示Windows配置已成功完成的对话框中,单击“确定”。

  运行Windows的计算机此时即配置完毕,可用于远程调试。接下来,将在这两台计算机之间建立连接,以便可以开始进行调试。

  将Visual Studio调试器连接到您的Mac上运行的基于Silverlight的应用程序

  1 在您的Mac计算机上启动要调试的基于Silverlight的应用程序。

  2 在运行Windows的计算机上,使用Visual Studio打开在Mac计算机上运行的应用程序所对应的Silverlight项目。

  3 在“调试”菜单上选择“附加到进程”。

  4 在“传输”下拉列表中选择“Silverlight远程跨平台调试”。

  5 在“限定符”组合框中,指定您的Mac计算机的完全限定域名或IP地址。

  “可用进程”窗口显示您的Mac上当前正在运行的进程的列表。

  6 选择基于Silverlight的应用程序进程。可以通过“类型”列来识别Silverlight进程。

  7 单击“附加”。

  Visual Studio调试器此时即附加到Mac中的目标进程。这时可以使用Visual Studio执行一般调试器任务,例如设置断点、逐句通过代码和检查调用堆栈。

  有时,您可能希望撤消刚执行过的配置。例如,可能需要针对Silverlight的下一版本对配置进行升级。下面的过程描述如何撤消前面的过程。

  移除Mac调试配置

  1 在运行Windows的计算机上打开一个命令提示窗口,然后运行下面的命令:

  如果是Windows Vista:

  rmdir /s /q %LOCALAPPDATA%\Microsoft\SilverlightDebuggingConfig1.0 

  如果是 Windows XP:

rmdir /s /q"USERPROFILE\LocalSettings\ApplicationData\Microsoft\SilverlightDebuggingConfig1.0" 
 
  2 在 Mac 计算机上打开一个终端窗口,然后运行以下命令:

  rm –rf ~/Library/Application\ Support/SilverlightdebuggingConfig1.0

  cd ~/Library/LaunchAgents

  launchctl unload ~/Library/LaunchAgents/com.microsoft.silverlight.debugproxy.plist

  rm ~/Library/LaunchAgents/com.microsoft.silverlight.debugproxy.plist

解决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运行,有时候也会出现一样的问题。单个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的对话框)的解决办法。

source from:http://www.imkevinyang.com/2009/09/%E8%A7%A3%E5%86%B3silverlight%E6%97%A0%E6%B3%95%E8%B0%83%E8%AF%95%E7%9A%84%E9%97%AE%E9%A2%98.html

 

posted on 2012-11-06 15:33  速速  阅读(832)  评论(0编辑  收藏  举报