Condividi tramite


Risolvere i problemi e creare i log per problemi relativi a MSBuild

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

Un valore di proprietà viene ignorato

Se una proprietà del progetto sembra essere impostata su un valore specifico, ma non ha alcun effetto in fase di compilazione, seguire questa procedura:

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

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

    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 dalla compilazione. Se la proprietà è impostata due volte, il secondo valore sovrascrive il primo. Inoltre, MSBuild valuta il progetto in diversi passaggi:

  • PropertyGroups e Imports
  • ItemDefinitionGroups
  • ItemGroups
  • Target

Considerato l'ordine seguente, quindi:

<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 viene valutato B durante la MyFile.txt compilazione (non A e non vuoto).

La compilazione incrementale include più elementi del necessario

Se MSBuild ricompila inutilmente un progetto o un elemento del 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 sta compilando nell'IDE di Visual Studio (con visualizzazione dettagliata nella finestra di output), nella finestra di output viene indicato il motivo per cui ogni progetto non è aggiornato:

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. Dal menu principale di Visual Studio, passare a Strumenti>Opzioni>Progetti e soluzioni>Compila ed esegui.

  2. Impostare dettaglio della compilazione del progetto MSBuild su Dettagliato in entrambe le caselle combinate. Il primo controlla il livello di dettaglio della compilazione nella finestra di output e il secondo controlla la {projectname}.log dettaglio della compilazione nel file creato nella directory intermedia di ogni progetto durante la compilazione.

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

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

    oppure

    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 si intende. 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.

Nota

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 da 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 MSBUILDDEBUGENGINE la variabile di ambiente su '1' e (facoltativamente) impostata su MSBUILDDEBUGPATH 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 MSBUILDDEBUGPATH la variabile di ambiente (o per impostazione predefinita viene eseguita la MSBuild_Logs sottocartella di una cartella corrente o %temp%, in base ai diritti di accesso).

Nota

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.

    Other Windows menu

  3. Selezionare Visualizza>altre registrazioni di compilazione di Windows>per visualizzare la finestra Registrazione 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.

    Build logging window

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

    Build logging context menu

È possibile visualizzare e cercare i file .binlog usando il Visualizzatore log strutturato di MSBuild.