Partager via


Diagnostiquer et créer des logs pour les problèmes MSBuild

Les procédures suivantes peuvent vous aider à diagnostiquer les problèmes de génération dans votre projet Visual Studio et, si nécessaire, créez un journal à envoyer à Microsoft pour examen.

Une valeur de propriété est ignorée

Si une propriété de projet apparaît définie sur une valeur particulière, mais que la propriété n’a aucun effet sur la compilation, procédez comme suit :

  1. Ouvrez l’invite de commandes développeur Visual Studio qui correspond à votre version de Visual Studio.

  2. Exécutez la commande suivante, après avoir remplacé les valeurs de votre chemin d’accès, de votre configuration et de votre nom de projet :

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

    Cette commande produit un fichier projet MSBuild « prétraité » (out.xml). Vous pouvez rechercher ce fichier dans une propriété spécifique pour voir où elle est définie.

La dernière définition d’une propriété est ce que la build consomme. Si la propriété est définie deux fois, la deuxième valeur remplace la première. En outre, MSBuild évalue le projet en plusieurs passes :

  • PropertyGroups et Imports
  • ItemDefinitionGroups
  • ItemGroups
  • Targets

Par conséquent, étant donné l’ordre suivant :

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

La valeur de MyMetadata pour l'élément MyFile.txt est évaluée à B pendant la compilation (et non A et non vide).

La génération incrémentielle génère plus qu’elle ne le doit

Si MSBuild régénère inutilement un projet ou un élément de projet, créez un journal de génération détaillé ou binaire. Vous pouvez rechercher dans le journal pour trouver le fichier qui a été généré ou compilé inutilement. La sortie ressemble à ceci :

  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

Si vous générez dans l’IDE Visual Studio (avec une verbosité détaillée de la fenêtre de sortie), la fenêtre de sortie affiche la raison pour laquelle chaque projet n’est pas à jour :

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.

Créer un journal détaillé

  1. Ouvrez le volet Outils>Options et développez la section Tous les paramètres>projets et solutions>Build et Exécution.
  1. Ouvrez la boîte de dialogueOptions> et développez la section Projets et Solutions>Build and Run.
  1. Utilisez les listes déroulantes pour régler à "Détaillé" à la fois les options de verbeux de sortie de build du projet MSBuild et de verbeux des fichiers journaux de build du projet MSBuild.

    Le premier contrôle la verbosité de la génération dans la fenêtre de sortie et le deuxième contrôle la verbosité de la génération dans le fichier qui est créé dans le {projectname}.log répertoire intermédiaire de chaque projet pendant la génération.

  2. À partir d’une invite de commandes du développeur Visual Studio, entrez l’une de ces commandes, en remplaçant vos valeurs réelles de chemin d’accès et de configuration :

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

    ou

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

    Un MSBuild.log fichier est créé dans le répertoire à partir duquel vous avez exécuté MSBuild.

Fournir des journaux binaires MSBuild à des fins d'enquête.

MSBuild a la possibilité de capturer un fichier journal binaire détaillé. Si vous rencontrez un problème de compilation et que vous pouvez fournir un log binaire, le log peut être utile pour examiner le problème.

Toutefois, vous devez savoir quel type d’informations est capturé dans le journal binaire pour vous assurer que vous ne partagez pas par inadvertance plus que prévu. Le journal binaire capture presque tout ce que fait votre build, y compris le contenu de vos fichiers projet et tous les fichiers (tels que .props et .targets) qu’ils importent, toutes les tâches qui sont exécutées pendant la génération, ainsi que les entrées et sorties, ainsi que les variables d’environnement qui ont été consultées dans cette session MSBuild. Il n’inclut généralement pas le contenu des fichiers sources compilés, mais il capture leurs noms et chemins complets.

Note

Certains environnements de génération rendent les secrets disponibles à l’aide de variables d’environnement. Avant de partager un journal binaire, assurez-vous qu’il n’expose pas de jetons d’API ou d’autres secrets importants.

Capturer des journaux binaires pour les compilations en ligne de commande

Vous pouvez créer un journal binaire en passant le -bl paramètre à MSBuild (MSBuild.exe ou dotnet build). Vous pouvez explorer le contenu du fichier généré .binlog à l’aide de MSBuild Structured Log Viewer ou dans votre navigateur à l’aide de Live Structured Log Viewer. MSBuild ne capture aucune donnée des journaux binaires affichés sur votre navigateur.

Examples

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

Consultez également plus de détails sur les logs binaires.

Capturer des journaux binaires via Visual Studio

Pour capturer les journaux d’activité pour tous les appels MSBuild :

Définissez la variable d'environnement MSBUILDDEBUGENGINE sur '1' et (éventuellement) définissez MSBUILDDEBUGPATH sur un dossier de destination existant pour stocker les journaux capturés. Démarrez ensuite Visual Studio à partir du même interpréteur de commandes pour hériter de l’environnement :

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

Les journaux binaires MSBuild sont ensuite capturés à un emplacement spécifié via la variable d’environnement MSBUILDDEBUGPATH (ou par défaut dans le sous-dossier MSBuild_Logs du dossier actuel ou %temp% selon les droits d’accès).

Note

Les journaux d’activité sont enregistrés pour chaque appel MSBuild (y compris les builds au moment de la conception) et conservés dans le dossier sans en supprimer d’anciens. Ainsi, le nombre de fichiers journaux peut croître rapidement. Il est recommandé de définir la variable d’environnement d’adhésion uniquement pour la courte durée de reproduction du problème à examiner (bien qu’il soit compréhensible que certains problèmes non déterministes aient besoin de plusieurs tentatives de reproduction).

Créer un journal MSBuild binaire à l’aide de l’extension Project System Tools

Consultez ce guide dans le référentiel Project System Tools pour capturer des fichiers binaires via Visual Studio.

  1. Téléchargez et installez l’extension Project System Tools.

  2. Une fois l’extension installée, certains nouveaux éléments apparaissent dans le menu Afficher>d’autres fenêtres .

    Autre menu Windows

  3. Sélectionnez Affichage>Autres fenêtres>Journalisation de build pour afficher la fenêtre Journalisation de build dans Visual Studio. Choisissez la première icône de barre d’outils pour commencer à enregistrer les builds régulières et au moment du design dans le système de projet.

    Fenêtre de journalisation de construction

  4. Une fois qu’une build est enregistrée, elle apparaît dans la fenêtre Journalisation de build. Cliquez avec le bouton droit sur l’élément et sélectionnez Enregistrer les journaux dans le menu contextuel pour enregistrer votre .binlog fichier.

    Menu contextuel de journalisation de build

Vous pouvez afficher et rechercher vos fichiers .binlog à l’aide de msBuild Structured Log Viewer.