疑難排解及建立 MSBuild 問題的記錄檔
下列程序可協助您診斷 Visual Studio 專案中的建置問題,並在有需要時建立記錄檔,以便傳送給 Microsoft 調查。
忽略屬性值
如果專案屬性似已設為特定值,但對組建沒有作用,請遵循下列步驟:
開啟與您 Visual Studio 版本對應的 Visual Studio 開發人員命令提示字元。
替換解決方案路徑、組態和專案名稱之後,執行下列命令:
MSBuild /p:SolutionDir="c:\MySolutionDir\";Configuration="MyConfiguration";Platform="Win32" /pp:out.xml MyProject.vcxproj
此命令會產生「前置處理過」的 MSBuild 專案檔 (out.xml)。 您可以搜尋該檔案的特定屬性,查看其定義的位置。
組建會取用屬性的最後定義。 如果屬性設定了兩次,第二個值會覆寫第一個值。 此外,MSBuild 會分數個階段評估專案:
- PropertyGroups 和 Imports
- ItemDefinitionGroups
- ItemGroups
- 目標
因此,假設順序如下:
<PropertyGroup>
<MyProperty>A</MyProperty>
</PropertyGroup>
<ItemGroup>
<MyItems Include="MyFile.txt"/>
</ItemGroup>
<ItemDefinitionGroup>
<MyItems>
<MyMetadata>$(MyProperty)</MyMetadata>
</MyItems>
</ItemDefinitionGroup>
<PropertyGroup>
<MyProperty>B</MyProperty>
</PropertyGroup>
MyFile.txt
項目的 MyMetadata
值會在建置期間評估為 B
(不是 A
,也不是空白)。
建置超過應有的累加組建
如果 MSBuild 非必要地重建專案或專案項目,請建立詳細或二進位的組建記錄檔。 您可以在記錄檔中搜尋非必要建置或編譯的檔案。 輸出會與下列內容類似:
Task "CL"
Using cached input dependency table built from:
F:\test\Project1\Project1\Debug\Project1.tlog\CL.read.1.tlog
Outputs for F:\TEST\PROJECT1\PROJECT1\PROJECT1.CPP:
F:\TEST\PROJECT1\PROJECT1\DEBUG\PROJECT1.OBJ
Project1.cpp will be compiled because F:\TEST\PROJECT1\PROJECT1\PROJECT1.H was modified at 6/5/2019 12:37:09 PM.
Outputs for F:\TEST\PROJECT1\PROJECT1\PROJECT1.CPP:
F:\TEST\PROJECT1\PROJECT1\DEBUG\PROJECT1.OBJ
Write Tracking Logs:
Debug\Project1.tlog\CL.write.1.tlog
如果您要在 Visual Studio IDE 中建置 (搭配詳盡的輸出視窗詳細資訊),則 [輸出視窗] 會顯示每個專案為何不是最新的原因:
1>------ Up-To-Date check: Project: Project1, Configuration: Debug Win32 ------
1>Project is not up-to-date: build input 'f:\test\project1\project1\project1.h' was modified after the last build finished.
建立詳細的記錄檔
從 Visual Studio 主功能表中,移至 [工具]>[選項]>[專案和方案]>[建置並執行]。
在兩個下拉式方塊中,將 [MSBuild 專案建置詳細程度] 設定為 [詳細]。 第一個會控制 [輸出視窗] 中的建置詳細程度,而第二個會控制
{projectname}.log
檔案中的建置詳細程度,此檔案是在建置期間於每個專案的中繼目錄中建立的。在 Visual Studio 開發人員命令提示字元中,輸入下列任一命令,替換實際的路徑和組態值:
MSBuild /p:Configuration="MyConfiguration";Platform="x86" /fl MySolution.sln
或
MSBuild /p:/p:SolutionDir="c:\MySolutionDir\";Configuration="MyConfiguration";Platform="Win32" /fl MyProject.vcxproj
系統會在您從中執行 MSBuild 的目錄中建立
MSBuild.log
檔案。
提供 MSBuild 二進位記錄以進行調查
MSBuild 能夠擷取詳細的二進位記錄檔。 如果您有建置問題且能夠提供二進位記錄,則此記錄對於調查問題很有幫助。
不過,您應該注意二進位記錄中擷取的資訊類型,以確保您不會不小心共用超過您預期的資訊。 二進位記錄幾乎會擷取您建置時所做的一切,包括專案檔的內容和其匯入的任何檔案 (例如 .props
和 .targets
)、在建置期間執行的所有工作以及輸入和輸出,也包括已在該 MSBuild 工作階段中存取的環境變數。 其通常不會包含編譯的來源檔案內容,但確實會擷取其完整名稱和路徑。
注意
某些建置環境可讓您使用環境變數取得祕密。 在共用二進位記錄之前,請確定其不會公開 API 權杖或其他重要祕密。
擷取命令列建置時的二進位記錄
您可以將 -bl
參數傳遞至 MSBuild (MSBuild.exe
或 dotnet build
) 來建立二進位記錄。 您可以使用 MSBuild 結構化記錄檢視器,或在瀏覽器中使用即時結構化記錄檢視器,來探索產生的 .binlog
檔案內容。 MSBuild 不會從瀏覽器上檢視的二進位記錄擷取任何資料。
範例
dotnet build -bl
dotnet build -bl:SpecificStep.binlog
MSBuild.exe -bl:ServiceRelease.binlog -p:Configuration=Release
另請參閱有關二進位記錄的更多詳細資料。
透過 Visual Studio 擷取二進位記錄
若要擷取所有 MSBuild 叫用的記錄:
將 MSBUILDDEBUGENGINE
環境變數設定為 '1'
,以及選擇性地將 MSBUILDDEBUGPATH
設定為現有的目的地資料夾,以儲存擷取的記錄。 然後,從相同的殼層啟動 Visual Studio 以繼承環境:
SET MSBUILDDEBUGENGINE=1
SET MSBUILDDEBUGPATH=C:\MSBuildReproLogs
devenv.exe MySolution.sln
$env:MSBUILDDEBUGENGINE = 1
$env:MSBUILDDEBUGPATH="C:\MSBuildReproLogs"
& "devenv.exe" MySolution.sln
MSBuild 二進位記錄接著會擷取至透過 MSBUILDDEBUGPATH
環境變數指定的位置 (或預設為目前資料夾的 MSBuild_Logs
子資料夾或 %temp%
,基於存取權)。
注意
系統會記錄每個 MSBuild 叫用的記錄 (包括設計階段建置),並將其保留在資料夾中,而不會移除較舊的記錄,因此記錄數目可以快速增長。 建議只在重現所要調查問題的短期內才設定加入環境變數 (儘管可以理解,但某些不具決定性的問題可能需要多次重現嘗試)。
使用 Project System Tools 延伸模組建立二進位 MSBuild 記錄
請參閱 Project System Tools 存放庫中的本指南,透過 Visual Studio 擷取 Binlog。
下載並安裝 Project System Tools 延伸模組。
安裝延伸模組之後,某些新項目會出現在 [檢視]>[其他 Windows] 功能表中。
選取 [檢視]>[其他 Windows]>[組建記錄],以顯示 Visual Studio 中的 [組建記錄] 視窗。 選擇第一個工具列圖示,開始錄製專案系統中的一般和設計階段組建。
記錄組建之後,就會出現在 [組建記錄] 視窗中。 以滑鼠右鍵按一下項目,然後選取捷徑功能表上的 [儲存記錄],以儲存您的
.binlog
檔案。
您可以使用 MSBuild Structured Log Viewer (MSBuild 結構化記錄檢視器) 檢視與搜尋 .binlog 檔案。