Sdílet prostřednictvím


Řešení problémů s MSBuildem a vytváření protokolů

Následující postupy vám můžou pomoct diagnostikovat problémy s sestavením v projektu sady Visual Studio a v případě potřeby vytvořit protokol pro odeslání do Microsoftu pro účely šetření.

Hodnota vlastnosti je ignorována.

Pokud je vlastnost projektu nastavena na určitou hodnotu, ale nemá žádný vliv na build, postupujte takto:

  1. Otevřete příkazový řádek pro vývojáře sady Visual Studio, který odpovídá vaší verzi sady Visual Studio.

  2. Po nahrazení hodnot cesty řešení, konfigurace a názvu projektu spusťte následující příkaz:

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

    Tento příkaz vytvoří "předzpracovaný" soubor projektu MSBuild (out.xml). V tomto souboru můžete vyhledat konkrétní vlastnost a zjistit, kde je definovaná.

Poslední definicí vlastnosti je to, co sestavení využívá. Pokud je vlastnost nastavena dvakrát, druhá hodnota přepíše první. Nástroj MSBuild také vyhodnocuje projekt v několika průchodech:

  • PropertyGroups a Import
  • SkupinyDefinicePoložek
  • ItemGroups
  • Targets

Proto je dáno následující pořadí:

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

Hodnota MyMetadata pro položku MyFile.txt se vyhodnotí jako B během sestavování (nikoli A a není prázdná).

Přírůstkové sestavení vytváří více, než by mělo

Pokud nástroj MSBuild zbytečně znovu sestavuje projekt nebo položku projektu, vytvořte podrobný nebo binární protokol sestavení. V protokolu můžete vyhledat soubor, který byl sestaven nebo kompilován zbytečně. Výstup vypadá přibližně takto:

  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

Pokud vytváříte integrované vývojové prostředí sady Visual Studio (s podrobnou podrobností okna výstupu), zobrazí okno výstupu důvod, proč každý projekt není 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.

Vytvořte podrobný protokol

  1. Otevřete podokno Nástroje>Možnosti a rozbalte část Všechna nastavení>Projekty a řešení>Sestavení a spuštění.
  1. Otevřete dialogové oknoMožnosti> a rozbalte oddíl Projekty a řešení>sestavení a spuštění.
  1. Použijte rozevírací seznamy a nastavte výstup sestavení projektu MSBuild i podrobnosti protokolu sestavení projektu MSBuild na Podrobné.

    Horní jedna řídí úroveň podrobností sestavení v okně výstupu a druhá řídí úroveň podrobností v {projectname}.log souboru vytvořeném v zprostředkujícím adresáři každého projektu během sestavování.

  2. Na příkazovém řádku vývojáře sady Visual Studio zadejte jeden z těchto příkazů a nahraďte skutečné hodnoty cesty a konfigurace:

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

    nebo

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

    V MSBuild.log adresáři, ze kterého jste spustili nástroj MSBuild, se vytvoří soubor.

Poskytněte binární protokoly nástroje MSBuild pro vyšetřování

Nástroj MSBuild má možnost zachytit podrobný binární logový soubor. Pokud máte problém s sestavením a máte možnost poskytnout binární protokol, může být tento protokol užitečný pro zkoumání problému.

Měli byste ale vědět, jaký typ informací se zaznamenává v binárním protokolu, abyste měli jistotu, že nechtěně nesdílíte více informací, než máte v úmyslu. Binární log zachycuje téměř vše, co vaše sestavení dělá, včetně obsahu souborů projektu a všech souborů (například .props a .targets), které importují, všech úkolů, které se spouštějí během sestavení, stejně jako vstupy a výstupy a proměnné prostředí, ke kterým byl přístup v dané relaci MSBuild. Obecně neobsahuje obsah zdrojových souborů, které jsou zkompilovány, ale zachycuje jejich úplné názvy a cesty.

Poznámka:

Některá prostředí sestavení zpřístupní tajné kódy pomocí proměnných prostředí. Před sdílením binárního logu se ujistěte, že nezpřístupňuje API tokeny ani jiné důvěrné informace.

Zachycení binárních protokolů pro sestavení příkazového řádku

Binární záznam můžete vytvořit předáním parametru -bl MSBuild (MSBuild.exe nebo dotnet build). Obsah vygenerovaného .binlog souboru můžete prozkoumat pomocí prohlížeče strukturovaného protokolu MSBuild nebo v prohlížeči pomocí prohlížeče Live Structured Log Viewer. Nástroj MSBuild nezachytává žádná data z binárních protokolů zobrazených v prohlížeči.

Examples

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

Další podrobnosti o binárních protokolech

Zachycení binárních logů prostřednictvím Visual Studio

Zachycení protokolů pro všechna vyvolání nástroje MSBuild:

Nastavte proměnnou prostředí MSBUILDDEBUGENGINE na '1' a (volitelně) nastavte MSBUILDDEBUGPATH na existující cílovou složku pro uložení zachycených protokolů. Potom spusťte Visual Studio ze stejného shellu, abyste převzali prostředí.

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

Binární logy MSBuild se pak zaznamenávají do umístění určeného prostřednictvím proměnné prostředí MSBUILDDEBUGPATH (nebo se ve výchozím nastavení používá podsložka MSBuild_Logs aktuální složky nebo %temp%, na základě přístupových práv).

Poznámka:

Protokoly se zaznamenávají pro každé vyvolání nástroje MSBuild (včetně sestavení návrhového času) a uchovávají se v určené složce bez odebrání starších souborů, což způsobuje rychlé zvětšování počtu souborů protokolu. Doporučuje se nastavit proměnnou prostředí opt-in pouze na krátkou dobu potřebnou k reprodukci problému (i když je pochopitelné, že některé nedeterministické problémy můžou vyžadovat více pokusů o reprodukci).

Vytvořte binární protokol MSBuild pomocí rozšíření Project System Tools

Projděte si tuto příručku v úložišti Nástrojů systému projektu pro zachycení binlogů prostřednictvím sady Visual Studio.

  1. Stáhněte a nainstalujte rozšíření Project System Tools.

  2. Po instalaci rozšíření se některé nové položky zobrazí v nabídce Zobrazit>ostatní okna .

    Jiná nabídka Windows

  3. Výběrem Zobrazit>Jiná okna>Protokolování sestavení zobrazíte okno Protokolování sestavení v sadě Visual Studio. Výběrem první ikony panelu nástrojů zahájíte záznam běžných i návrhových buildů v systému projektu.

    Okno protokolování sestavení

  4. Po zaznamenání sestavení se zobrazí v okně Protokolování sestavení. Klikněte pravým tlačítkem myši na položku a v místní nabídce vyberte Uložit protokoly a uložte .binlog soubor.

    Místní nabídka protokolování sestavení

Soubory .binlog můžete zobrazit a prohledávat pomocí nástroje MSBuild Structured Log Viewer.