TechEd2008- .NET 應用程式除錯秘技系列(2) - Design Time Exception

故事是這樣的~ 我建立了一個簡單到不行的web 專案, 裏頭只有一個sitemap設定及default page. 在default page中放了一個TreeView控制項。並且將TreeView的DataSource指定為SiteMapDataSource,結果當我要看設計畫面時,一個錯誤噴出了!!

snap006

不是應該要出現一個美美的(其實也還好)TreeView,然後顯示各個節點(TreeNode)的資訊嗎?

範例可以在這裏下載!!

 

開發工具本來就是讓我們用來開發除錯的~結果開發工具自己卻出錯(汗...),怎麼來處理這個問題呢? 我們可以用另外一個VS2008來debug有問題的web 專案!!

首先先開啟另一個Visual Studio 2008, 點選 Tools -> Attach To Process , 選擇有問題的web專案(PID是4820)

snap007

接下來我們要設定讓VS2008在接收到什麼Exception時會中斷下來,預設是沒有設定的(就像是程式跑在debug mode,但沒有設定任何斷點一樣)但這裏不是設定斷點,而是Exception事件觸發,我們可以在Debug -> Exceptions加以設定,但要設定什麼呢? 這時候就必須倚賴經驗了,從上面的錯誤訊息,我們可以推斷它跟"URI"有關,因此我們可以透過"Find"按鈕來去尋找相關的exception,如下圖所示,我們透過"URI"這個關鍵字找到了"System.UriFormatException",記得勾選旁邊的小框框, 以確認在這個exception發生時,VS2008能被通知到。

snap009

除了"URI"以外,您也可以嚐試其他不同的關鍵字,例如"FileNotFound"、"NullReference"、"SocketException".... 如果測試時發現您所指定的Exception並不能夠被觸發,表示您設定的Exception是不正確的,您可以多指定幾個,或是將這個Exception的上一層全部選取(以此例來說,您可以選取"System"),但system底下的事件不少,在實際的除錯當中,可能會常被中斷。

snap010

設定好Exception之後,我們要切回原本有問題的專案,讓問題重現(就是再開啟一次default.aspx的設計畫面)。若是您有設定讓VS2008下載.NET Framework source code (請參考前一篇文章),用來debug的VS2008會自動下載相關的source code並斷在出錯的地方。

snap011

我們可以看到,發生錯誤的function是 "CreateThis",在這個funtion裏呼叫並執行完"InitializeUri"後,拋出了一個UriFormatExcption。根本的原因是,TreeView在設計時期會檢查資料來源的路徑,若是一個絕對路徑,則會造成解析上的錯誤,我們再來看一下TreeView的DataSource,也就是SiteMapDataSource:

snap012

的確有一個絕對路徑指向"https://www.microsoft.com",儘管這會造成Design Time的小錯誤,但專案還是可以執行的。

 

補充:

這個問題若要透過WinDbg來分析是比較困難的,原因如下:

1. WinDbg只能針對CLR Exception去Handle,無法細到要去handle某一個特定的.NET Exception ( Win32的Exception是可以的)

2. 無法搭配source code來檢視問題發生原因。

 

有興趣挑戰的朋友,可以試試看。後面再介紹完TechEd系列後,會接著介紹WinDbg的基本概念,有機會再來分享這個問題如何從WinDbg分析。