Comparteix a través de


Solución de problemas y creación de registros para MSBuild

Los procedimientos siguientes pueden ayudarle a diagnosticar problemas de compilación en su proyecto de Visual Studio y, si fuera necesario, crear un registro para enviarlo a Microsoft para su investigación.

Se omite un valor de propiedad

Si la propiedad de un proyecto aparece establecida en un valor determinado, pero no surte efecto en la compilación, siga estos pasos:

  1. Abra el símbolo del sistema para desarrolladores de Visual Studio que corresponda a su versión de Visual Studio.

  2. Ejecute el comando siguiente, después de sustituir los valores para la ruta de la solución, la configuración y el nombre del proyecto:

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

    Este comando genera un archivo de proyecto de MSBuild "preprocesado" (out.xml). Puede buscar en ese archivo una propiedad específica para ver dónde está definido.

La última definición de una propiedad es lo que consume la compilación. Si la propiedad se establece dos veces, el segundo valor sobrescribe el primero. Además, MSBuild evalúa el proyecto en varias fases:

  • PropertyGroups e Imports
  • ItemDefinitionGroups
  • ItemGroups
  • Destinos

Por lo tanto, dado el orden siguiente:

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

El valor de MyMetadata para el elemento MyFile.txt se evalúa para B durante la compilación (no A y no está vacío).

La compilación incremental está compilando más de lo que debería

Si MSBuild está volviendo a compilar innecesariamente un proyecto o un elemento de proyecto, cree un registro de compilación detallado o binario. Puede buscar en el registro el archivo que se creó o compiló innecesariamente. La salida tendrá un aspecto similar a este:

  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 va a compilar en el IDE de Visual Studio (con información detallada sobre la ventana de salida), la Ventana de salida muestra el motivo por el cual cada proyecto no está actualizado:

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.

Creación de un registro detallado

  1. En el menú principal de Visual Studio, vaya a Herramientas>Opciones>Proyectos y soluciones>Compilar y ejecutar.

  2. Establezca el nivel de detalle de la compilación del proyecto de MSBuild en Detallado en los dos cuadros combinados. El primero controla el nivel de detalle de la compilación en la Ventana de salida, mientras que el segundo controla el nivel de detalle de la compilación en el archivo {projectname}.log que se crea en el directorio intermedio de cada proyecto durante la compilación.

  3. Desde un símbolo del sistema para desarrolladores de Visual Studio, escriba uno de estos comandos, sustituyendo sus valores reales de ruta de acceso y configuración:

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

    o

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

    Se crea un archivo MSBuild.log en el directorio desde el que ejecutó MSBuild.

Proporcionar registros binarios de MSBuild para la investigación

MSBuild tiene la capacidad de capturar un archivo de registro binario detallado. Si tiene un problema de compilación y puede proporcionar un registro binario, el registro puede resultar útil para investigar el problema.

Sin embargo, debe tener en cuenta qué tipo de información se captura en el registro binario para asegurarse de no compartir accidentalmente más de lo que pretende. El registro binario captura casi todo lo que hace la compilación, incluido el contenido de los archivos del proyecto y los archivos (como .props y .targets) que importan, todas las tareas que se ejecutan durante la compilación, así como las variables de entrada y salida y las variables de entorno a las que se ha accedido en esa sesión de MSBuild. Por lo general, no incluye el contenido de los archivos de código fuente que se compilan, pero sí captura sus nombres completos y rutas de acceso.

Nota:

Algunos entornos de compilación hacen que los secretos estén disponibles mediante variables de entorno. Antes de compartir un registro binario, asegúrese de que no exponga tokens de API ni otros secretos importantes.

Captura de registros binarios para compilaciones de línea de comandos

Puede crear un registro binario pasando el parámetro -bl a MSBuild (MSBuild.exe o dotnet build). Puede explorar el contenido del archivo .binlog generado mediante MSBuild Structured Log Viewer o en el explorador mediante Live Structured Log Viewer. MSBuild no captura datos de los registros binarios visualizados en el explorador.

Ejemplos

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

Consulte también Más detalles sobre los registros binarios.

Captura de registros binarios a través de Visual Studio

Para capturar registros para todas las invocaciones de MSBuild:

Establezca la variable de entorno MSBUILDDEBUGENGINE en '1' y, opcionalmente, establezca MSBUILDDEBUGPATH en una carpeta de destino existente para almacenar los registros capturados. A continuación, inicie Visual Studio desde el mismo shell para heredar el entorno:

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

A continuación, los registros binarios de MSBuild se capturan en una ubicación especificada mediante la variable de entorno MSBUILDDEBUGPATH (o, de manera predeterminada, en la subcarpeta MSBuild_Logs de una carpeta actual o en %temp%, en función de los derechos de acceso).

Nota:

Los registros se registran para cada invocación de MSBuild (incluidas las compilaciones en tiempo de diseño) y se mantienen en la carpeta sin quitar los más antiguos, por lo que el número de archivos de registro puede crecer rápidamente. Se recomienda establecer la variable de entorno de participación solo por la breve duración de la reproducción del problema que se va a investigar (aunque es comprensible que algunos problemas no deterministas necesiten varios intentos de reproducción).

Creación de un registro de MSBuild binario mediante la extensión de herramientas del sistema del proyecto

Consulte esta guía en el repositorio de herramientas del sistema del proyecto para capturar archivos binarios a través de Visual Studio.

  1. Descargue e instale la extensión de herramientas del sistema del proyecto.

  2. Una vez instalada la extensión, algunos elementos nuevos aparecen en el menú Ver>Otras ventanas.

    Other Windows menu

  3. Seleccione Ver>Otras ventanas>Build Logging (Registro de compilación) para mostrar la ventana Registro de compilación en Visual Studio. Elija el primer icono de la barra de herramientas para iniciar la grabación de compilaciones normales y en tiempo de diseño en el sistema del proyecto.

    Build logging window

  4. Una vez que se registra una compilación, aparece en la ventana Registro de compilación. Haga clic con el botón derecho en el elemento y seleccione Guardar registros en el menú contextual para guardar el archivo .binlog.

    Build logging context menu

Puede verlo y buscar los archivos .binlog por medio del visor de registros estructurado de Msbuild.