1. 程式人生 > >在 Visual Studio 中除錯 MSBuild 指令碼

在 Visual Studio 中除錯 MSBuild 指令碼

除錯步驟

在開始之前,先開啟 Visual Studio 的設定,確認 "Just My Code" 被勾上:

image

除錯前準備

首先在登錄檔 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\4.0 的位置下建立一個 debuggerenabled=true 的專案,這樣能使 MSBuild.exe 支援 "/debug" 開關。 

下圖示例在 Visual Studio 命令列中使用 reg.exe 來完成本步驟:

image

開啟登錄檔確認專案被建立成功:

image

執行 MSBuild /? 你可以發現新的"/debug" 開關

image

現在我們可以開始除錯了:

這裡為了更直觀的說明,將使用一個新建的 C# Windows Forms 工程,啟動帶 /debug 開關的MSBuild命令列,它會在執行一開始停下:

image

我這裡會彈出一個對話方塊,選擇 Yes:

image

然後 JIT debugging 對話方塊彈出,確認勾選了 "Manually choose the debugging engines"

image

然後選擇需要除錯的型別,一般只要選擇 Managed 就行了。

image

現在開始除錯咯~~

image

首先你會注意到我們正在第一個工程檔案的最頂端,就像你使用 "F11" 除錯一個常規的程式。此時 MSBuild 已經讀入了系統變數以及初始設定:

image

按 F10 可進行單步除錯:

image

每當你執行過一條屬性設定,locals 視窗中會立即重新整理:

image

image

試著在各個 Item 上使用 F9 來增加斷點?抱歉, MSBuild 無法支援。(對於屬性設定來說,MSBuild 只有走到該處才能識別,未走到的無法識別也就無法設定斷點)

在 <Import> 上使用 F9 來增加斷點,然後按 F5 執行到該語句

image

點選 F11,Visual Studio 自動切入到 <Import> 節點指向的檔案,本例中該檔案是: Microsoft.CSharp.targets

image

在 Callstack 視窗中顯示了以上的呼叫跳轉資訊(與方法之間的呼叫非常相似哦):

image

當然本質上來說 <Import> 和 方法間的呼叫完全不同,它更類似於 C++ 中的 #include 機制: 只是把另一個檔案中的內容插入進來。但是通常情況下不用在意這一點,善用Callstack 視窗,你能很容易地把握整個流程的呼叫關係。

在多個 <Import> 上新增斷點,然後點選 F11 除錯,Callstack 視窗會變成以下的樣子

image

仔細看下 locals 視窗,您能看到屬性及其 metadata 資訊。這裡有一個小bug(紅字部分),無視它,展開 "Non-public members" 節點可以看到所有變數名及值:

image

image

有時候你想確認某個條件是否成立,你可以在 immediate 視窗中使用 EvaluateCondition 方法來實現:

image

如果你希望獲得某個表示式的值,只需改為使用 EvaluateExpression 方法:

image

這個方法不需要切到 locals 視窗就能非常簡便的察看屬性值,但是需要注意下特殊字元。

Autos 視窗無法工作,但是 Watch 視窗是可以正常工作的。

image

在 Immediate 視窗中你可以改變幾乎任何的狀態變數。例如: 變更一下屬性值

image

你能夠通過這種方法完成很多工作,開啟 Watch 視窗屬性變數已經被更新了:

image