Поделиться через


Устранение неполадок и создание журналов для проблем MSBuild

Следующие процедуры помогут диагностировать проблемы сборки в проекте Visual Studio и при необходимости создать журнал для отправки в Корпорацию Майкрософт для изучения.

Значение свойства игнорируется

Если для свойства проекта задано определенное значение, но свойство не влияет на сборку, выполните следующие действия:

  1. Откройте командную строку разработчика Visual Studio, соответствующую вашей версии Visual Studio.

  2. Выполните следующую команду после замены значений пути решения, конфигурации и имени проекта:

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

    Эта команда создает файл проекта MSBuild с предварительной обработкой (out.xml). Вы можете выполнить поиск в этом файле по конкретному свойству, чтобы увидеть, где оно указано.

Последнее определение свойства — это то, что использует сборка. Если свойство задано дважды, то второе значение перезаписывает первое. Кроме того, MSBuild оценивает проект в нескольких этапах.

  • PropertyGroups и Импорты
  • ГруппыОпределенийЭлементов
  • ItemGroups
  • Targets

Таким образом, учитывая следующий порядок:

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

Значение элемента MyFile.txt оценивается как B во время сборки (не A и не пустое).

Инкрементная сборка создает больше, чем требуется.

Если MSBuild излишне перестраивает проект или элемент проекта, для этого создайте подробный или двоичный журнал сборки. Вы можете искать в журнале файл, созданный или скомпилированный без необходимости. Выходные данные выглядят примерно так:

  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

Если вы создаете среду разработки Visual Studio (с подробной детализацией окна вывода), окно вывода отображает причину, по которой каждый проект не 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.

Создание подробного журнала

  1. Откройте панель Инструменты>Параметры и разверните раздел Все параметры>Проекты и решения>Сборка и выполнение.
  1. Откройте диалоговое окно"Параметры>" и разверните раздел "Проекты и решения>сборка и запуск".
  1. Используйте раскрывающиеся списки и установите параметры как для детализации выходных данных сборки проекта MSBuild, так и для детализации файла журнала сборки проекта MSBuild в положение Подробно.

    Верхний переключатель управляет детализацией вывода в окне вывода, а второй переключатель контролирует детализацию информации в {projectname}.log файле, который создаётся в промежуточном каталоге каждого проекта во время сборки.

  2. В командной строке разработчика Visual Studio введите одну из этих команд, заменив фактические значения пути и конфигурации:

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

    или

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

    Файл MSBuild.log создается в каталоге, из который вы запустили MSBuild.

Предоставление двоичных журналов MSBuild для исследования

MSBuild имеет возможность записывать подробный двоичный файл журнала. Если у вас возникла проблема со сборкой и есть возможность предоставить двоичный журнал, он может быть полезен для изучения проблемы.

Однако следует знать, какой тип информации фиксируется в двоичном журнале, чтобы убедиться, что вы не делитесь ею в большем объеме, чем планируете. Двоичный журнал захватывает практически все, что делает ваша сборка, включая содержимое файлов вашего проекта и любые файлы (например, .props и .targets), которые они импортируют, все задачи, выполняемые во время сборки, входные и выходные данные, а также переменные среды, использованные в ходе сессии MSBuild. Обычно он не включает содержимое исходных файлов, скомпилированных, но записывает их полные имена и пути.

Замечание

Некоторые среды сборки предоставляют секреты с помощью переменных среды. Перед тем как делиться двоичным журналом, убедитесь, что он не содержит маркеры API или другие важные секреты.

Запись журналов двоичных данных для командно-строчных сборок

Вы можете создать двоичный журнал, передав -bl параметр в MSBuild (MSBuild.exe или dotnet build). Содержимое созданного .binlog файла можно просмотреть с помощью средства просмотра структурированных журналов MSBuild или в браузере с помощью средства просмотра структурированных журналов в режиме реального времени. MSBuild не записывает данные из двоичных журналов, просмотренных в браузере.

Примеры

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

Дополнительные сведения о двоичных журналах см. в разделе "Дополнительные сведения".

Запись двоичных журналов с помощью Visual Studio

Чтобы записать журналы для всех вызовов MSBuild:

Установите для переменной среды MSBUILDDEBUGENGINE значение '1', и (по желанию) задайте для MSBUILDDEBUGPATH путь к существующей папке назначения для хранения захваченных журналов. Затем запустите Visual Studio из той же оболочки, чтобы наследовать среду.

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

Затем двоичные журналы MSBuild записываются в расположение, указанное с помощью переменной среды MSBUILDDEBUGPATH (или по умолчанию в подкаталог MSBuild_Logs текущей папки или %temp%, в зависимости от прав доступа).

Замечание

Журналы записываются для каждого вызова MSBuild (включая сборки времени разработки) и хранятся в папке без удаления старых файлов, поэтому количество файлов журналов может быстро увеличиваться. Рекомендуется задать переменную среды согласия только в течение короткого времени воспроизведения проблемы, которую следует исследовать (хотя понятно, что некоторые недетерминированные проблемы могут потребовать нескольких попыток воспроизведения).

Создание двоичного журнала MSBuild с помощью расширения Project System Tools

Ознакомьтесь с этим руководством в репозитории Project System Tools для записи двоичных журналов с помощью Visual Studio.

  1. Скачайте и установите расширение Project System Tools.

  2. После установки расширения некоторые новые элементы отображаются в меню "Просмотр>других окон ".

    Другое меню Windows

  3. Выберите Вид>Другие окна>Журнал сборки, чтобы отобразить окно Журнал сборки в Visual Studio. Выберите первый значок панели инструментов, чтобы начать запись регулярных и временных сборок в системе проекта.

    Окно ведения журнала сборки

  4. После записи сборки он появится в окне ведения журнала сборки. Щелкните элемент правой кнопкой мыши и выберите "Сохранить журналы " в контекстном меню, чтобы сохранить .binlog файл.

    Контекстное меню создания журнала

Вы можете просматривать и искать файлы binlog с помощью средства просмотра структурированных журналов MSBuild.