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 suatu properti proyek tampaknya diatur ke nilai tertentu, tetapi properti tersebut tidak berdampak 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 yang digunakan oleh proses build. Jika properti diatur dua kali, nilai yang kedua akan menggantikan nilai yang pertama. Selain itu, MSBuild mengevaluasi proyek dalam beberapa pass:

  • Grup Properti dan Impor
  • GrupDefinisiItem
  • Kelompok 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 item MyFile.txt dievaluasi menjadi B selama build (tidak A dan tidak kosong).

Build bertahap membangun lebih banyak daripada yang diperlukan

Jika MSBuild membangun ulang proyek atau item proyek yang tidak diperlukan, buat log build yang terperinci atau biner. Anda dapat mencari log untuk file yang dibuat atau dikompilasi secara tidak perlu. Outputnya 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 tingkat kejelasan jendela keluaran terperinci), Jendela Output menampilkan alasan mengapa setiap proyek tidak terbaru.

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. Buka panel Tools Options> dan perluas bagian All Settings>Projects and Solutions>Build and Run.
  1. Buka dialog Alat>Opsi dan perluas bagian Proyek dan Solusi>Build dan Jalankan.
  1. Gunakan daftar dropdown dan atur verbositas output build proyek MSBuild dan opsi verbositas file log build proyek MSBuild ke Terperinci.

    Pengaturan pertama mengatur tingkat detail build di Jendela Output dan yang kedua mengatur tingkat detail proses pembangunan dalam file {projectname}.log yang dibuat di direktori sementara setiap proyek selama proses pembangunan.

  2. Dari jendela perintah pengembang Visual Studio, ketik salah satu perintah berikut, gantilah jalur dan nilai konfigurasi yang sesuai dengan milik 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 dalam proses build dan dapat memberikan log biner, log tersebut 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 berkas sumber yang dikompilasi, tetapi memang menangkap nama lengkap dan path-nya.

Nota

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

Menangkap log biner untuk kompilasi 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.

Examples

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 mengadopsi konfigurasi 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 direkam ke lokasi yang ditentukan melalui variabel lingkungan MSBUILDDEBUGPATH (atau secara default ke subfolder dari folder saat ini MSBuild_Logs atau %temp%, berdasarkan hak akses).

Nota

Log-log direkam untuk setiap pemanggilan MSBuild (termasuk build waktu desain) dan disimpan di folder tanpa menghapus yang lebih lama, sehingga jumlah file log dapat dengan cepat bertambah. Disarankan untuk mengatur variabel lingkungan opt-in hanya untuk jangka waktu pendek selama mereproduksi masalah yang sedang 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 .

    Menu Windows Lainnya

  3. Pilih View>Jendela Lainnya>Pengelogan Build untuk menampilkan jendela Pengelogan Build di Visual Studio. Pilih ikon pertama di toolbar untuk mulai merekam build reguler dan proses desain dalam sistem proyek.

    Jendela pembuatan log

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

    Menu konteks pembuatan log

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