如果能夠遠端除錯部署在 Azure 上的 Web App,將會極大的提高我們修復 bug 的效率。Visual Studio 一貫以功能強大、好用著稱,當然可以通吃基於 Azure 應用的建立、釋出和除錯。接下來就讓我們一起看看如何使用 Visual Studio 遠端除錯部署在 Azure 上的 Web App,以及一些常見的注意事項。
注意工具的版本
在開始正文前讓我們先檢查一下使用的 Azure SDK 版本和 Visual Studio 的版本。根據 MSDN 的介紹,Azure 的遠端除錯功能是在 Azure SDK 2.2 中加入的,所以請確保您的機器上安裝了 2.2 或者是更新的 Azure SDK。
關於 Visual Studio 的版本問題,MSDN 上的描述也很有趣。大意是使用 Visual Studio 2012 已經可以遠端除錯 Azure 上的 Website 了,但是 Visual Studio 2013 又對此做了很多的提升。個人理解最好使用 VS2013,或者更新的版本。
筆者在寫本文時的實驗環境是 VS2015 update3 和 Azure SDK 2.9。
原理簡介
如果我們要使用執行在機器A上的 Visual Studio 除錯另外一臺機器B上執行的一個程式 myapp (機器B上沒有安裝 visual studio),我們不僅要把附帶 pdb 檔案的 myapp 程式部署到機器B上,還要在機器B上執行一個除錯輔助程式 msvsmon.exe。執行 msvsmon.exe 後,Visual Studio 就能夠 attach 住 myapp 並使用其 pdb 檔案進行除錯。這就是 Visual Studio 的遠端除錯功能。而 msvsmon.exe 程式必須與特定版本的 Visual Studio 相匹配才能工作,所以它被整合在 Visual Studio 的安裝包中,用時去 Visual Studio 的安裝目錄中搜尋就能找到。
遠端除錯 Azure Web App 和上面的過程是一樣的。只不過我們需要透過雲端的配置來指定 msvsmon.exe 對應的 Visual Studio 版本,並告訴雲端開啟一些除錯所需的埠。
下面就讓我們一步步的踏上 VS 遠端除錯 Azure App 之路。
設定 Deployment credentials
這個不需要過多的解釋,當我們部署網站時就需要建立這個賬號。當然這個賬號既可以用來部署又可以用來遠端除錯。
下載釋出用的 publishing profile
Publishing profile 是用於進行釋出操作的配置檔案。當我們要釋出一個網站或者是一個 web 應用時,需要很多的基本資訊,比如伺服器在哪裡?使用者名稱是什麼?密碼是什麼?等等…這些資訊統統儲存在 publishing profile 檔案中,有興趣的朋友可以開啟這個檔案看看裡面的詳細資訊。
無論除錯與否,我們都要把應用釋出到 Azure 上去,下載 publishing profile 先:
允許遠端除錯 Web App
設定 Application settings 中的遠端除錯為允許狀態,並指定用於遠端除錯的 Visual Studio 版本。相關內容已經在原理部分講過,這裡說些需要注意的內容:
這兩項設定是有期限的,在 48 小時之後預設會被關掉!
原因主要是效能和安全。所以建議大家在除錯完成後立即關閉遠端除錯功能。
釋出除錯版本的 Web App
Visual Studio 的除錯功能依賴於編譯過程中產生的 pdb 檔案。下面的設定就是讓 Web App 在釋出時編譯為 debug 版本併產生對應的 pdb 檔案。現在的 Visual Studio 已經可以智慧的去找 pdb 檔案了,所以這裡我們不用關心 pdb 檔案是被髮布到了雲端還是儲存在本地(簡單就好)!
先匯入剛才下載的 publishing profile 檔案:
在 Settings 中選擇 Configuration 為”Debug”:
然後點選 “Publish”按鈕進行釋出。
Attach 遠端程式
在 Attach 對話方塊中輸入網站 URL 中去掉”http://”的部分,然後在彈出的對話方塊中輸入我們在最開始處建立的使用者名稱和密碼。
列表中選擇”w3wp.exe”:
在列出的程式點選”Attach”按鈕就可以了。
心急的同學可要注意了,這裡可能需要等待上那麼一小會兒…
開始遠端除錯 Web App
當你看到設定的斷點變成可用狀態時,就可以嘗試去觸發一個斷點了。
好了,看上去還不賴,能夠工作了!
注意,實際使用過程中可能並不會這麼的順利。主要是在 attach 的時候,可能需要多試幾次才能成功。除錯的過程中速度也是個問題,感覺還是有點慢。
另外,除錯 Web 程式經常會碰到讓人很尷尬的一幕:正好有另外的一個使用者在使用這個功能(可能是測試人員),此時不要太吃驚喔!