MSBuild의 문제 해결 및 로그 만들기

다음 절차는 Visual Studio 프로젝트에서 빌드 문제를 진단하고 필요한 경우 조사를 위해 Microsoft로 보낼 로그를 만드는 데 도움이 됩니다.

속성 값은 무시됩니다.

프로젝트 속성이 특정 값으로 설정된 것으로 보이지만 빌드에 영향을 주지는 않는 경우 다음 단계를 수행합니다.

  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 및 Imports
  • ItemDefinitionGroups
  • ItemGroups
  • 대상

따라서 다음과 같은 순서인 경우:

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

항목의 MyMetadataMyFile.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 IDE(출력 창의 자세한 정도가 지정된)에서 빌드하는 경우 출력 창은 각 프로젝트가 최신 상태가 아닌 이유를 표시합니다.

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. Visual Studio 주 메뉴에서 도구>옵션>프로젝트 및 솔루션>빌드 및 실행으로 이동합니다.

  2. 두 콤보 상자 모두에서 MSbuild 프로젝트 빌드 자세한 정도를자세히로 설정합니다. 첫 번째 컨트롤은 출력 창의 세부 정보 표시를 빌드하고 두 번째 컨트롤은 빌드 중에 각 프로젝트의 중간 디렉터리에서 만들어진 {projectname}.log 파일의 세부 정보 표시를 빌드합니다.

  3. 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를 실행한 디렉터리에 MSBuild.log 파일이 만들어집니다.

조사를 위해 MSBuild 이진 로그 제공

MSBuild에는 자세한 이진 로그 파일을 캡처하는 기능이 있습니다. 빌드 문제가 있고 이진 로그를 제공할 수 있는 경우 로그는 문제를 조사하는 데 도움이 될 수 있습니다.

그러나 의도치 않게 의도치 않게 더 많은 정보를 공유하지 않도록 이진 로그에 캡처되는 정보 유형을 알고 있어야 합니다. 이진 로그는 프로젝트 파일의 내용과 가져오는 파일(예: .props.targets), 빌드 중에 실행되는 모든 작업, 입력 및 출력뿐만 아니라 해당 MSBuild 세션에서 액세스된 환경 변수를 포함하여 빌드에서 수행하는 거의 모든 작업을 캡처합니다. 일반적으로 컴파일된 원본 파일의 내용은 포함되지 않지만 전체 이름과 경로를 캡처합니다.

참고 항목

일부 빌드 환경에서는 환경 변수를 사용하여 비밀을 사용할 수 있습니다. 이진 로그를 공유하기 전에 API 토큰 또는 기타 중요한 비밀을 노출하지 않는지 확인합니다.

명령줄 빌드에 대한 이진 로그 캡처

MSBuild(MSBuild.exe 또는 dotnet build)에 -bl 매개 변수를 전달하여 이진 로그를 만들 수 있습니다. MSBuild 구조적 로그 뷰어를 사용하거나 라이브 구조적 로그 뷰어를 사용하여 브라우저에서 생성된 .binlog 파일의 내용을 탐색할 수 있습니다. 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 로그 만들기

Visual Studio를 통해 binlog를 캡처하려면 Project System Tools 리포지토리에서 이 가이드를 참조하세요.

  1. 프로젝트 시스템 도구 확장을 다운로드하고 설치합니다.

  2. 확장이 설치되면 일부 새 항목이 보기>다른 창 메뉴에 표시됩니다.

    Other Windows menu

  3. 보기>다른 창>빌드 로깅을 선택하면 Visual Studio에 빌드 로깅이 표시됩니다. 첫 번째 도구 모음 아이콘을 선택하여 프로젝트 시스템에서 일반 및 디자인 타임 빌드를 모두 기록하기 시작합니다.

    Build logging window

  4. 빌드가 기록되면 빌드 로깅 창에 표시됩니다. 항목을 마우스 오른쪽 단추로 클릭하고 바로 가기 메뉴에서 로그 저장을 선택하여 .binlog 파일을 저장합니다.

    Build logging context menu

MSBuild 구조적 로그 뷰어를 사용하여 .binlog 파일을 보고 검색할 수 있습니다.