Bagikan melalui


Memecahkan masalah dan membuat log untuk masalah MSBuild

Prosedur berikut dapat membantu Anda mendiagnosis masalah build di proyek Visual Studio Anda, dan, jika perlu, membuat log untuk dikirim ke Microsoft untuk penyelidikan.

Nilai properti diabaikan

Jika properti proyek tampaknya diatur ke nilai tertentu, tetapi tidak berpengaruh pada build, ikuti langkah-langkah berikut:

  1. Buka Perintah Pengembang Visual Studio yang sesuai dengan versi Visual Studio Anda.

  2. Jalankan perintah berikut, setelah mengganti nilai untuk jalur solusi, konfigurasi, dan nama proyek Anda:

    MSBuild /p:SolutionDir="c:\MySolutionDir\";Configuration="MyConfiguration";Platform="Win32" /pp:out.xml MyProject.vcxproj
    

    Perintah ini menghasilkan file proyek MSBuild "preprocessed" (out.xml). Anda dapat mencari file tersebut untuk properti tertentu untuk melihat di mana properti tersebut ditentukan.

Definisi terakhir dari properti adalah apa yang digunakan build. Jika properti diatur dua kali, nilai kedua akan menimpa yang pertama. Selain itu, MSBuild mengevaluasi proyek dalam beberapa pass:

  • PropertyGroups dan Imports
  • ItemDefinitionGroups
  • Grup Item
  • Target

Oleh karena itu, diberikan urutan berikut:

<PropertyGroup>
   <MyProperty>A</MyProperty>
</PropertyGroup>
<ItemGroup>
   <MyItems Include="MyFile.txt"/>
</ItemGroup>
<ItemDefinitionGroup>
  <MyItems>
      <MyMetadata>$(MyProperty)</MyMetadata>
  </MyItems>
</ItemDefinitionGroup>
<PropertyGroup>
   <MyProperty>B</MyProperty>
</PropertyGroup>

Nilai MyMetadata untuk MyFile.txt item dievaluasi selama B build (tidak dan tidak A kosong).

Build inkremental membangun lebih dari yang seharusnya

Jika MSBuild tidak perlu membangun ulang item proyek atau proyek, buat log build terperinci atau biner. Anda dapat mencari log untuk file yang dibuat atau dikompilasi secara tidak perlu. Output terlihat seperti ini:

  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

Jika Anda membangun di Visual Studio IDE (dengan verbositas jendela output terperinci), Jendela Output menampilkan alasan mengapa setiap proyek tidak diperbarui:

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.

Membuat log terperinci

  1. Dari menu utama Visual Studio, buka Proyek Opsi>Alat>dan Build dan Jalankan Solusi.>

  2. Atur verbositas build proyek MSBuild ke Terperinci di kedua kotak kombo. Kontrol teratas membangun verbositas di Jendela Output dan kontrol kedua mengontrol membangun verbositas dalam {projectname}.log file yang dibuat di direktori perantara setiap proyek selama build.

  3. Dari perintah pengembang Visual Studio, masukkan salah satu perintah ini, ganti jalur aktual dan nilai konfigurasi Anda:

    MSBuild /p:Configuration="MyConfiguration";Platform="x86" /fl MySolution.sln
    

    or

    MSBuild /p:/p:SolutionDir="c:\MySolutionDir\";Configuration="MyConfiguration";Platform="Win32" /fl MyProject.vcxproj
    

    File MSBuild.log dibuat di direktori tempat Anda menjalankan MSBuild.

Menyediakan log biner MSBuild untuk penyelidikan

MSBuild memiliki kemampuan untuk mengambil file log biner terperinci. Jika Anda mengalami masalah build dan dapat memberikan log biner, log dapat membantu untuk menyelidiki masalah tersebut.

Namun, Anda harus mengetahui jenis informasi apa yang diambil dalam log biner untuk memastikan Anda tidak secara tidak sengaja berbagi lebih dari yang Anda inginkan. Log biner menangkap hampir semua yang dilakukan build Anda, termasuk konten file proyek Anda dan file apa pun (seperti .props dan .targets) yang mereka impor, semua tugas yang dijalankan selama build serta input dan output, serta variabel lingkungan yang telah diakses dalam sesi MSBuild tersebut. Umumnya tidak menyertakan konten file sumber yang dikompilasi, tetapi memang menangkap nama lengkap dan jalurnya.

Catatan

Beberapa lingkungan build membuat rahasia tersedia menggunakan variabel lingkungan. Sebelum berbagi log biner, pastikan log tidak mengekspos token API atau rahasia penting lainnya.

Mengambil log biner untuk build baris perintah

Anda dapat membuat log biner dengan meneruskan -bl parameter ke MSBuild (MSBuild.exe atau dotnet build). Anda dapat menjelajahi konten file yang dihasilkan .binlog menggunakan MSBuild Structured Log Viewer atau di browser Anda menggunakan Penampil Log Terstruktur Langsung. MSBuild tidak mengambil data apa pun dari log biner yang dilihat di browser Anda.

Contoh

dotnet build -bl
dotnet build -bl:SpecificStep.binlog
MSBuild.exe -bl:ServiceRelease.binlog -p:Configuration=Release

Lihat juga Detail selengkapnya tentang log biner.

Mengambil log biner melalui Visual Studio

Untuk mengambil log untuk semua pemanggilan MSBuild:

Atur MSBUILDDEBUGENGINE variabel lingkungan ke '1' dan (opsional) diatur MSBUILDDEBUGPATH ke folder tujuan yang ada untuk menyimpan log yang diambil. Kemudian mulai Visual Studio dari shell yang sama untuk mewarisi lingkungan:

SET MSBUILDDEBUGENGINE=1
SET MSBUILDDEBUGPATH=C:\MSBuildReproLogs
devenv.exe MySolution.sln
$env:MSBUILDDEBUGENGINE = 1
$env:MSBUILDDEBUGPATH="C:\MSBuildReproLogs"
& "devenv.exe" MySolution.sln

Log biner MSBuild kemudian diambil ke lokasi yang ditentukan melalui MSBUILDDEBUGPATH variabel lingkungan (atau default ke MSBuild_Logs subfolder folder saat ini atau %temp%, berdasarkan hak akses).

Catatan

Log direkam untuk setiap pemanggilan MSBuild (termasuk build waktu desain) dan disimpan di folder tanpa menghapus yang lebih lama - sehingga jumlah file log dapat tumbuh dengan cepat. Disarankan untuk mengatur variabel lingkungan keikutsertaan hanya untuk durasi singkat mereproduksi masalah yang akan diselidiki (meskipun dapat dimengerti bahwa beberapa masalah nondeterministik mungkin memerlukan beberapa upaya reproduksi).

Membuat log MSBuild biner dengan menggunakan ekstensi Alat Sistem Proyek

Lihat panduan ini di repositori Alat Sistem Proyek untuk menangkap binlog melalui Visual Studio.

  1. Unduh dan instal ekstensi Alat Sistem Proyek.

  2. Setelah ekstensi diinstal, beberapa item baru muncul di menu Tampilkan>Windows Lainnya.

    Other Windows menu

  3. Pilih Tampilkan>Pengelogan Build Windows>Lainnya untuk menampilkan jendela Pembuatan Log di Visual Studio. Pilih ikon toolbar pertama untuk mulai merekam build reguler dan waktu desain dalam sistem proyek.

    Build logging window

  4. Setelah build direkam, build akan muncul di jendela Pembuatan Log Build. Klik kanan item dan pilih Simpan Log pada menu konteks untuk menyimpan file Anda .binlog .

    Build logging context menu

Anda dapat melihat dan mencari file .binlog dengan menggunakan MSBuild Structured Log Viewer.