Compartilhar via


Solucionar problemas e criar logs para problemas do MSBuild

Os procedimentos a seguir podem ajudá-lo a diagnosticar problemas de build em seu projeto do Visual Studio e, se necessário, criar um log para enviar à Microsoft para investigação.

Um valor de propriedade é ignorado

Se uma propriedade de projeto aparecer definida como um valor específico, mas a propriedade não tiver efeito no build, siga estas etapas:

  1. Abra o Prompt de Comando do Desenvolvedor do Visual Studio que corresponde à sua versão do Visual Studio.

  2. Execute o seguinte comando, depois de substituir os valores para o caminho da solução, a configuração e o nome do projeto:

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

    Esse comando produz um arquivo de projeto do MSBuild "pré-processado" (out.xml). Você pode pesquisar nesse arquivo uma propriedade específica para ver onde ela está definida.

A última definição de uma propriedade é o que o build consome. Se a propriedade for definida duas vezes, o segundo valor substituirá o primeiro. Além disso, o MSBuild avalia o projeto em várias passagens:

  • Grupos de Propriedades and Imports
  • GruposDeDefiniçãoDeItens
  • ItemGroups
  • Metas

Portanto, dada a seguinte ordem:

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

O valor do item MyMetadataMyFile.txt é avaliado para B durante a construção (não A e não está vazio).

A compilação incremental está compilando mais do que deveria

Se o MSBuild estiver recriando desnecessariamente um projeto ou item de projeto, crie um log de build detalhado ou binário. Você pode procurar no log pelo arquivo que foi construído ou compilado desnecessariamente. A saída é semelhante a esta:

  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 você estiver criando no IDE do Visual Studio (com verbosidade detalhada da janela de saída), a Janela de Saída exibirá o motivo pelo qual cada projeto não está up-to-date:

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.

Criar um log detalhado

  1. Abra o painel Ferramentas>Opções e expanda a seção Todos os Configurações>Projetos e Soluções>Compilação e Execução.
  1. Abra a caixa de diálogoOpções de > e expanda a seçãoCompilação e Execução de >.
  1. Use as listas suspensas e defina as opções de verbosidade de saída de build do projeto MSBuild e as opções de verbosidade do arquivo de log de build do projeto MSBuild como Detalhadas.

    A parte superior controla a verbosidade da compilação na Janela de Saída, enquanto a segunda controla a verbosidade no arquivo criado no diretório intermediário de cada projeto durante a {projectname}.log compilação.

  2. Em um prompt de comando do desenvolvedor do Visual Studio, insira um destes comandos, substituindo o caminho real e os valores de configuração:

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

    or

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

    Um MSBuild.log arquivo é criado no diretório do qual você executou o MSBuild.

Forneça logs binários do MSBuild para investigação

O MSBuild tem a capacidade de capturar um arquivo de log binário detalhado. Se você estiver enfrentando um problema de build e puder fornecer um log binário, ele poderá ser útil para a investigação do problema.

No entanto, você deve estar ciente de que tipo de informação é capturada no log binário para garantir que você não esteja compartilhando inadvertidamente mais do que você pretende. O log binário captura quase tudo o que seu build faz, incluindo o conteúdo de seus arquivos de projeto e quaisquer arquivos (como .props e .targets) que eles importam, todas as tarefas que são executadas durante o build, bem como a entrada e a saída, bem como variáveis de ambiente que foram acessadas nessa sessão do MSBuild. Geralmente, ele não inclui o conteúdo dos arquivos de origem compilados, mas captura seus nomes e caminhos completos.

Observação

Alguns ambientes de build disponibilizam segredos usando variáveis de ambiente. Antes de compartilhar um log binário, verifique se ele não expõe tokens de API ou outros segredos importantes.

Capturar logs binários para compilações de linha de comando

Você pode criar um log binário passando o -bl parâmetro para o MSBuild (MSBuild.exe ou dotnet build). Você pode explorar o conteúdo do arquivo gerado .binlog usando o Visualizador de Log Estruturado do MSBuild ou em seu navegador usando o Visualizador de Log Estruturado Ao Vivo. O MSBuild não captura dados de logs binários exibidos no navegador.

Exemplos

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

Veja também Mais detalhes sobre logs binários.

Capturar logs binários por meio do Visual Studio

Para capturar logs para todas as invocações do MSBuild:

Defina MSBUILDDEBUGENGINE a variável de ambiente para '1' e (opcionalmente) defina MSBUILDDEBUGPATH para uma pasta de destino existente para armazenar os logs capturados. Em seguida, inicie o Visual Studio na mesma interface de linha de comando (shell) para herdar o ambiente.

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

Os logs binários do MSBuild são capturados em um local especificado por meio da variável de ambiente MSBUILDDEBUGPATH (ou, por padrão, na subpasta MSBuild_Logs da pasta atual ou %temp%, com base nos direitos de acesso).

Observação

Os logs são registrados para cada invocação do MSBuild (incluindo builds de tempo de projeto) e mantidos na pasta sem remover os mais antigos, de forma que o número de arquivos de log pode crescer rapidamente. É recomendável definir a variável de ambiente de aceitação apenas para a curta duração da reprodução do problema a ser investigado (embora seja compreensível que alguns problemas não determinísticos precisem de várias tentativas de reprodução).

Criar um log binário do MSBuild usando a extensão Ferramentas do Sistema de Projeto

Consulte este guia no repositório ferramentas do sistema de projeto para capturar binlogs por meio do Visual Studio.

  1. Baixe e instale a extensão Ferramentas do Sistema de Projeto.

  2. Depois que a extensão é instalada, alguns novos itens aparecem no menu Exibir>Outros Windows .

    Outros menus do Windows

  3. Selecione Exibir>Outras Janelas>Log de Build para mostrar a janela Log de Build no Visual Studio. Escolha o primeiro ícone da barra de ferramentas para iniciar a gravação de builds regulares e de tempo de desenvolvimento no sistema de gerenciamento de projetos.

    Criar janela de registro em log

  4. Depois que um build é gravado, ele aparece na janela Build Logging. Clique com o botão direito do mouse no item e selecione Salvar Logs no menu de contexto para salvar o .binlog arquivo.

    Menu de contexto de registro em log de build

Você pode exibir e pesquisar seus arquivos .binlog usando o Visualizador de Log Estruturado do MSBuild.