Condividi tramite


Risolvere e creare log per i problemi di MSBuild

Le procedure seguenti consentono di diagnosticare i problemi di compilazione nel progetto di Visual Studio e, se necessario, creare un log da inviare a Microsoft per l'analisi.

Un valore della proprietà viene ignorato

Se una proprietà del progetto viene impostata su un valore specifico, ma la proprietà non ha alcun effetto sulla compilazione, seguire questa procedura:

  1. Aprire il prompt dei comandi per gli sviluppatori di Visual Studio corrispondente alla versione di Visual Studio.

  2. Eseguire il comando seguente, dopo aver sostituito i valori per il percorso, la configurazione e il nome del progetto della soluzione:

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

    Questo comando produce un file di progetto MSBuild "pre-elaborato" (out.xml). È possibile cercare in tale file una proprietà specifica per vedere dove è definita.

L'ultima definizione di una proprietà è quella utilizzata dal build. Se la proprietà viene impostata due volte, il secondo valore sovrascrive il primo. INOLTRE, MSBuild valuta il progetto in diversi passaggi:

  • PropertyGroups e Imports
  • ItemDefinitionGroups
  • ItemGroups
  • Obiettivi

Pertanto, in base all'ordine seguente:

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

Il valore di MyMetadata per l'elemento MyFile.txt viene valutato a B durante la compilazione (non A e non vuoto).

La compilazione incrementale sta creando più di quanto dovrebbe

Se MSBuild ricompila inutilmente un progetto o un elemento di progetto, creare un log di compilazione dettagliato o binario. È possibile cercare nel log il file che è stato creato o compilato inutilmente. L'output è simile al seguente:

  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

Se si esegue la compilazione nell'IDE di Visual Studio (con dettaglio della finestra di output), nella finestra di output viene visualizzato il motivo per cui ogni progetto non è up-to-date:

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.

Creare un log dettagliato

  1. Aprire il riquadro Opzioni strumenti> ed espandere la sezione Tutte le impostazioni>>.
  1. Aprire la finestra di dialogo Strumenti>Opzioni ed espandere la sezione Progetti e soluzioni>Compilazione e esecuzione.
  1. Utilizzare gli elenchi a discesa e impostare sia l'opzione di verbalità dell'output di compilazione del progetto MSBuild che l'opzione di verbalità del file di log di compilazione del progetto MSBuild su Dettagliato.

    Il primo controlla il livello di dettaglio della compilazione nella finestra di output e il secondo controlla il livello di dettaglio della compilazione nel file creato nella directory intermedia di ogni progetto durante la compilazione.

  2. Da un prompt dei comandi per gli sviluppatori di Visual Studio immettere uno di questi comandi, sostituendo il percorso e i valori di configurazione effettivi:

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

    o

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

    Viene creato un MSBuild.log file nella directory da cui è stato eseguito MSBuild.

Specificare i log binari di MSBuild per l'analisi

MSBuild ha la possibilità di acquisire un file di log binario dettagliato. Se si verifica un problema di compilazione e si è in grado di fornire un log binario, il log può essere utile per analizzare il problema.

Tuttavia, è necessario essere consapevoli del tipo di informazioni acquisite nel log binario per assicurarsi di non condividere inavvertitamente più di quanto previsto. Il log binario acquisisce quasi tutte le operazioni eseguite dalla compilazione, inclusi il contenuto dei file di progetto e tutti i file (ad esempio .props e .targets) importati, tutte le attività eseguite durante la compilazione e l'input e l'output, nonché le variabili di ambiente a cui è stato eseguito l'accesso in tale sessione di MSBuild. In genere non include il contenuto dei file di origine compilati, ma acquisisce i nomi completi e i percorsi.

Annotazioni

Alcuni ambienti di compilazione rendono disponibili i segreti usando le variabili di ambiente. Prima di condividere un log binario, assicurarsi che non esponga token API o altri segreti importanti.

Acquisire i log binari per le compilazioni a riga di comando

È possibile creare un log binario passando il -bl parametro a MSBuild (MSBuild.exe o dotnet build). È possibile esplorare il contenuto del file generato .binlog usando MSBuild Structured Log Viewer o nel browser usando Live Structured Log Viewer. MSBuild non acquisisce dati dai log binari visualizzati nel browser.

Esempi

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

Vedere anche Altri dettagli sui log binari.

Acquisire log binari tramite Visual Studio

Per acquisire i log per tutte le chiamate di MSBuild:

Impostare la variabile di ambiente MSBUILDDEBUGENGINE su '1' e (facoltativamente) impostare MSBUILDDEBUGPATH su una cartella di destinazione esistente per archiviare i log acquisiti. Avviare quindi Visual Studio dalla stessa shell per ereditare l'ambiente:

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

I log binari di MSBuild vengono quindi acquisiti in un percorso specificato tramite la variabile di ambiente MSBUILDDEBUGPATH (o per impostazione predefinita nella sottocartella MSBuild_Logs della cartella corrente %temp%, in base ai diritti di accesso).

Annotazioni

I log vengono registrati per ogni chiamata di MSBuild (incluse le build in fase di progettazione) e mantenuti nella cartella senza rimuovere quelli meno recenti, in modo che il numero di file di log possa crescere rapidamente. È consigliabile impostare la variabile di ambiente di consenso esplicito solo per la breve durata della riproduzione del problema da analizzare (anche se è comprensibile che alcuni problemi non deterministici potrebbero richiedere più tentativi di riproduzione).

Creare un log MSBuild binario usando l'estensione Project System Tools

Vedere questa guida nel repository Project System Tools per l'acquisizione di binlog tramite Visual Studio.

  1. Scaricare e installare l'estensione Project System Tools.

  2. Dopo aver installato l'estensione, alcuni nuovi elementi vengono visualizzati nel menu Visualizza>altre finestre .

    Menu delle altre finestre

  3. Selezionare Visualizza>Altre finestre>Registrazione di compilazione per visualizzare la finestra Registrazione di compilazione in Visual Studio. Scegliere la prima icona della barra degli strumenti per avviare la registrazione delle compilazioni regolari e della fase di progettazione nel sistema di progetto.

    Finestra di log di compilazione

  4. Una volta registrata una compilazione, viene visualizzata nella finestra Registro delle compilazioni. Fare clic con il pulsante destro del mouse sull'elemento e scegliere Salva log dal menu di scelta rapida per salvare il .binlog file.

    Menu contestuale del log della compilazione

È possibile visualizzare e cercare i file con estensione binlog usando MSBuild Structured Log Viewer.