在 Visual Studio 中調試 MSBuild 腳本

原文地址: Debugging MSBuild script with Visual Studio

 

調試步驟

在開始之前,先打開 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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章