解決Silverlight無法調試的問題

來源:互聯網
上載者:User
文章目錄
  • 解決Silverlight無法調試的問題
解決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的調試器會自動幫我們選擇進程的偵錯類型,例如是Managed 程式碼調試,還是指令碼調試,等等。我們選中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的對話方塊)的解決辦法。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.