Partilhar via


Solucionar problemas e criar logs para problemas do MSBuild

Os procedimentos a seguir podem ajudá-lo a diagnosticar problemas de compilação 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 na compilação, siga estas etapas:

  1. Abra o prompt de comando do Visual Studio Developer que corresponde à sua versão do Visual Studio.

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

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

    Este comando produz um ficheiro de projeto MSBuild "pré-processado" (out.xml). Você pode pesquisar esse arquivo por uma propriedade específica para ver onde ele está definido.

A última definição de um imóvel é o que a construção 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 e Importações
  • ItemDefinitionGroups
  • Grupos de Itens
  • Targets

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 de MyMetadata para o item MyFile.txt é avaliado como B durante a construção (não A e não vazio).

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

Se o MSBuild estiver reconstruindo desnecessariamente um projeto ou item de projeto, crie um log de compilação detalhado ou binário. Você pode pesquisar no log o arquivo que foi gerado ou compilado desnecessariamente. A saída é mais ou menos assim:

  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 estiver a desenvolver no IDE do Visual Studio (com a informação detalhada da janela de saída), a janela de saída exibirá o motivo pelo qual cada projeto não está atualizado.

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 registo detalhado

  1. Abra o painelOpções de> e expanda a seção Todas as configurações>,Projetos e Soluções>,Criar e Executar.
  1. Abra a caixade diálogo Opções de > e expanda a seção Projetos e Soluções>Criar e Executar.
  1. Use as listas suspensas e defina as opções de verbosidade de saída de compilação do projeto MSBuild e verbosidade do arquivo de log de compilação do projeto MSBuild como Detalhada.

    O primeiro controla a verbosidade da compilação na janela de saída e o segundo controla a {projectname}.log verbosidade da compilação no arquivo que é criado no diretório intermediário de cada projeto durante a 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
    

    ou

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

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

Solicitar os logs binários do MSBuild para investigação

MSBuild tem a capacidade de capturar um arquivo de log binário detalhado. Se você estiver tendo um problema de compilação e for capaz de fornecer um log binário, o log pode ser útil para investigar o problema.

No entanto, você deve estar ciente de que tipo de informação é capturada no log binário para se certificar de que você não está inadvertidamente compartilhando mais do que você pretende. O log binário captura quase tudo o que sua compilação 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 a compilação, bem como a entrada e saída, bem como variáveis de ambiente que foram acessadas nessa sessão do MSBuild. Ele geralmente não inclui o conteúdo dos arquivos de origem que são compilados, mas captura seus nomes completos e caminhos.

Observação

Alguns ambientes de compilação disponibilizam segredos usando variáveis de ambiente. Antes de compartilhar um log binário, certifique-se de que ele não exponha 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 MSBuild (MSBuild.exe ou dotnet build). Você pode explorar o conteúdo do arquivo gerado .binlog usando o MSBuild Structured Log Viewer ou em seu navegador usando o Live Structured Log Viewer. O MSBuild não captura dados de logs binários visualizados no seu navegador.

Examples

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

Consulte 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 a variável de ambiente MSBUILDDEBUGENGINE para '1' e (opcionalmente) MSBUILDDEBUGPATH para uma pasta de destino existente para armazenar os logs capturados. Em seguida, inicie o Visual Studio a partir do mesmo 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 para um local especificado através da variável de ambiente MSBUILDDEBUGPATH (ou por padrão, para a subpasta MSBuild_Logs de uma pasta atual ou %temp%, com base nos direitos de acesso).

Observação

Os registos são gravados para cada execução do MSBuild (incluindo compilações em tempo de design) e mantidos na pasta sem remover os mais antigos, o que significa que o número de ficheiros de registo pode crescer rapidamente. Recomenda-se definir a variável de ambiente opt-in apenas para o curto período de reprodução do problema a ser investigado (embora seja compreensível que alguns problemas não determinísticos possam precisar de várias tentativas de reprodução).

Criar um log binário do MSBuild usando a extensão Project System Tools

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 Project System Tools.

  2. Uma vez instalada a extensão, alguns novos itens aparecem no menu Exibir>outras janelas .

    Outros menus do Windows

  3. Selecione Ver>Outras Janelas>Log de Construção para mostrar a janela Log de Construção no Visual Studio. Escolha o primeiro ícone da barra de ferramentas para começar a gravar compilações regulares e em tempo de design no sistema de projeto.

    Construir janela de registro

  4. Depois que uma compilação é registada, ela aparece na janela de Registo de Compilação. Clique com o botão direito do mouse no item e selecione Salvar logs no menu de contexto para salvar o .binlog arquivo.

    Construir menu de contexto de log

Você pode exibir e pesquisar seus arquivos .binlog usando o MSBuild Structured Log Viewer.