共用方式為


疑難排解及建立 MSBuild 問題的記錄檔

下列程序可協助您診斷 Visual Studio 專案中的建置問題,並在有需要時建立記錄檔,以便傳送給 Microsoft 調查。

忽略屬性值

如果專案屬性似已設為特定值,但對組建沒有作用,請遵循下列步驟:

  1. 開啟與您 Visual Studio 版本對應的 Visual Studio 開發人員命令提示字元。

  2. 替換解決方案路徑、組態和專案名稱之後,執行下列命令:

    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.

建立詳細的記錄檔

  1. 從 Visual Studio 主功能表中,移至 [工具]>[選項]>[專案和方案]>[建置並執行]

  2. 在兩個下拉式方塊中,將 [MSBuild 專案建置詳細程度] 設定為 [詳細]。 第一個會控制 [輸出視窗] 中的建置詳細程度,而第二個會控制 {projectname}.log 檔案中的建置詳細程度,此檔案是在建置期間於每個專案的中繼目錄中建立的。

  3. 在 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.exedotnet 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。

  1. 下載並安裝 Project System Tools 延伸模組

  2. 安裝延伸模組之後,某些新項目會出現在 [檢視]>[其他 Windows] 功能表中。

    Other Windows menu

  3. 選取 [檢視]>[其他 Windows]>[組建記錄],以顯示 Visual Studio 中的 [組建記錄] 視窗。 選擇第一個工具列圖示,開始錄製專案系統中的一般和設計階段組建。

    Build logging window

  4. 記錄組建之後,就會出現在 [組建記錄] 視窗中。 以滑鼠右鍵按一下項目,然後選取捷徑功能表上的 [儲存記錄],以儲存您的 .binlog 檔案。

    Build logging context menu

您可以使用 MSBuild Structured Log Viewer (MSBuild 結構化記錄檢視器) 檢視與搜尋 .binlog 檔案。