Share via


Détecter un problème et créer des journaux pour les problèmes MSBuild

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

Une valeur de propriété est ignorée

Si une propriété de projet semble être définie sur une valeur particulière, mais n’a aucun effet sur la build, procédez comme suit :

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

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

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

    Cette commande génère un fichier de projet MSBuild « prétraité » (out.xml). Vous pouvez rechercher une propriété spécifique de ce fichier afin de voir où elle est définie.

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

  • PropertyGroup et importations
  • ItemDefinitionGroups
  • ItemGroup
  • 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 génération (non A et non vide).

La build incrémentielle génère plus qu’il le devrait

Si MSBuild régénère inutilement un projet ou élément de projet, créez un journal de génération détaillé ou binaire. Vous pouvez rechercher dans le journal 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 compilez dans l’IDE Visual Studio (avec commentaires relatifs à la Fenêtre Sortie détaillés), la Fenêtre 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. Dans le menu principal de Visual Studio, accédez à Outils>Options>Projets et Solutions>Générer et exécuter.

  2. Définissez Commentaires relatifs à la build du projet MSBuild sur Détaillé dans les deux zones de liste déroulante. La première zone contrôle la quantité d’informations sur la build dans la Fenêtre Sortie et la seconde zone contrôle la quantité d’informations sur la build dans le fichier {projectname}.log qui est créé dans le répertoire intermédiaire de chaque projet pendant la génération.

  3. À partir d’une invite de commandes développeur Visual Studio, entrez une de ces commandes, en remplaçant les valeurs de chemin d’accès et de configuration courantes :

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

    or

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

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

Fournir des journaux binaires MSBuild pour l’investigation

MSBuild a la possibilité de capturer un fichier journal binaire détaillé. Si vous rencontrez un problème de génération et que vous pouvez fournir un journal binaire, le journal 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.

Remarque

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 builds de ligne de commande

Vous pouvez créer un journal binaire en passant le paramètre -bl à MSBuild (MSBuild.exe ou dotnet build). Vous pouvez explorer le contenu du fichier .binlog généré à 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.

Exemples

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

Consultez également Plus d’informations sur les journaux binaires.

Capturer des journaux binaires via Visual Studio

Pour capturer les journaux 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 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é par le biais d’une variable d’environnement MSBUILDDEBUGPATH (ou, par défaut, sur le sous-dossier MSBuild_Logs d’un dossier actif ou %temp%, en fonction des droits d’accès).

Remarque

Les journaux sont enregistrés pour chaque appel MSBuild (y compris les builds au moment de la conception) et conservés dans le dossier sans supprimer les 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 journaux binaires via Visual Studio.

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

  2. Une fois l’extension installée, de nouveaux éléments apparaissent dans le menu Afficher>Autres Fenêtres.

    Other Windows menu

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

    Build logging window

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

    Build logging context menu

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