다음을 통해 공유


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 및 가져오기
  • 항목 정의 그룹
  • 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>

MyMetadata 항목의 MyFile.txt 값은 A가 아니고 비어 있지 않을 때, 빌드 중에 B로 평가됩니다.

증분 빌드가 필요 이상으로 진행되고 있습니다.

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. 도구>옵션 창을 열고 모든 설정>프로젝트 및 솔루션> 섹션을 확장합니다.
  1. 도구>옵션 대화 상자를 열고 프로젝트 및 솔루션> 섹션을 확장합니다.
  1. 드롭다운 목록을 사용하고 MSBuild 프로젝트 빌드 출력 세부 정보 표시MSBuild 프로젝트 빌드 로그 파일 세부 정보 표시 옵션을 모두 자세히 설정합니다.

    최상위 설정은 출력 창에서 빌드의 상세 정보를 조정하고, 두 번째 설정은 빌드 시 각 프로젝트의 중간 디렉터리에 생성되는 파일의 상세 정보 수준을 조정합니다.

  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 토큰 또는 기타 중요한 비밀을 노출하지 않는지 확인합니다.

명령줄 빌드에 대한 바이너리 로그 캡처

MSBuild(-bl또는MSBuild.exe)에 매개 변수를 dotnet build 전달하여 이진 로그를 만들 수 있습니다. .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 이진 로그는 환경 변수를 통해 지정된 위치로 캡처되고, 액세스 권한에 따라 현재 폴더의 MSBuild_Logs 하위 폴더 또는 %temp%로 기본 설정됩니다.

비고

로그는 각 MSBuild 호출(디자인 타임 빌드 포함)에 대해 기록되고 이전 로그 파일을 제거하지 않고 폴더에 보관되므로 로그 파일 수가 빠르게 증가할 수 있습니다. 조사할 문제를 재현하는 짧은 기간 동안만 옵트인 환경 변수를 설정하는 것이 좋습니다(일부 비결정적 문제에는 여러 번의 재현 시도가 필요할 수 있음).

Project System Tools 확장을 사용하여 MSBuild 이진 로그를 생성하기

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

  1. Project System Tools 확장을 다운로드하고 설치합니다.

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

    기타 Windows 메뉴

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

    빌드 로깅 창

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

    빌드 로깅 상황에 맞는 메뉴

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