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:
Aprire il prompt dei comandi per gli sviluppatori di Visual Studio corrispondente alla versione in uso di Visual Studio.
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
Dal menu principale di Visual Studio, passare a Strumenti>Opzioni>Progetti e soluzioni>Compila ed esegui.
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.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.
Dopo aver installato l'estensione, alcuni nuovi elementi vengono visualizzati nel menu Visualizza>altre finestre.
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.
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.
È possibile visualizzare e cercare i file .binlog usando il Visualizzatore log strutturato di MSBuild.