동시성 시각화 도우미 명령줄 유틸리티(CVCollectionCmd.exe)를 사용하여 명령줄에서 추적을 수집하여 Visual Studio용 동시성 시각화 도우미에서 볼 수 있습니다. Visual Studio가 설치되지 않은 컴퓨터에서 도구를 사용할 수 있습니다.
비고
동시성 시각화 도우미는 선택적 확장입니다. (이전에는 Visual Studio에 포함되었습니다.) 다운로드 센터에서 Visual Studio용 동시성 시각화 도우미 컬렉션 도구를 다운로드할 수 있습니다.
동시성 시각화 도우미 명령줄 유틸리티 다운로드
명령줄 유틸리티를 다운로드하여 설치하려면 Visual Studio용 동시성 시각화 도우미 컬렉션 도구 로 이동하여 지침을 따릅니다. 기본적으로 CVCollectionCmd.exe %ProgramFiles%\Microsoft 동시성 시각화 도우미 컬렉션 도구\(x64 컴퓨터의%ProgramFiles(x86)%\Microsoft 동시성 시각화 도우미 컬렉션 도구\)에 설치됩니다.
CVCollectionCmd를 사용하여 추적 수집
CVCollectionCmd를 사용하여 앱을 시작하거나 연결하여 추적을 수집할 수 있습니다. 옵션은 아래 명령 참조를 참조하세요. 예를 들면 다음과 같습니다.
<Path>CVCollectionCmd /launch c:\myapp\myapp.exe /outdir c:\myapp\data
명령 및 매개 변수
명령줄 유틸리티의 명령 및 매개 변수에 대한 도움말을 보려면 명령 프롬프트에 다음을 입력합니다.
CvCollectionCmd /?
| Option | Description | 매개 변수 | 반환 값 |
|---|---|---|---|
| Query | 컬렉션을 시작할 수 있는지 여부를 반환합니다. | None | 컬렉션을 시작할 준비가 되면 0으로 표시됩니다. 컬렉션이 이미 진행 중인 경우 1입니다. 2 컬렉션이 진행 중이 아닌 경우 하나 이상의 필수 ETW 세션이 이미 활성화되어 있습니다. |
| Launch | 동시성 시각화 도우미에서 지정된 프로세스를 실행합니다. | 실행 파일의 경로입니다. | 실행이 성공하면 0입니다. 대상 애플리케이션을 시작할 수 없어서 실행이 실패한 경우 1입니다. CVCollectionCmd에 지정된 출력 디렉터리에 쓸 권한이 부족하여 실행이 실패한 경우 13입니다. |
| Attach | 시스템 전체 추적을 수집하기 시작합니다. 그렇지 않으면 지정된 프로세스에 연결합니다. | 없음. | 첨부 파일이 성공하면 0입니다. 지정된 프로세스가 잘못되었거나 모호하기 때문에 첨부 파일이 실패한 경우 1입니다. CVCollectionCmd에 지정된 출력 디렉터리에 쓸 수 있는 권한이 부족하여 첨부 파일이 실패한 경우 13입니다. |
| Detach | 컬렉션을 중지합니다. | 없음. | 분리에 성공하면 0입니다. 컬렉션이 현재 진행 중이 아니므로 분리에 실패한 경우 1입니다. 컬렉션을 중지할 수 없어 분리에 실패한 경우 2입니다. |
| Analyze | 지정된 추적을 분석합니다. | CVTrace 파일의 전체 경로입니다. | 분석이 성공하면 0입니다. 지정된 추적이 시스템 전체이지만 대상 프로세스가 지정되지 않아 분석을 시작할 수 없는 경우 1입니다. 2 추적이 시스템 차원이 아니고 프로세스가 지정되어 분석을 시작할 수 없는 경우 지정된 프로세스가 잘못되어 분석이 실패한 경우 3입니다. 지정된 CVTrace 파일이 잘못되어 분석이 실패한 경우 4입니다. |
| LaunchArgs | 대상 실행 파일 인수를 지정합니다. 이 옵션은 시작 명령에만 적용됩니다. | 애플리케이션에 대한 명령줄 인수입니다. | 없음. |
| Outdir | 추적 파일을 저장할 디렉터리를 지정합니다. 시작 및 연결 명령에 적용됩니다. | 디렉터리 경로 또는 상대 경로입니다. | 없음. |
| 프로세스 | Attach 명령이 실행될 때 연결할 프로세스를 지정하거나, Analyze 명령이 실행될 때 분석할 추적 프로세스를 지정합니다. 연결 및 분석 명령에 적용됩니다. | PID 또는 프로세스의 이름입니다. | 없음. |
| 설정 | 기본값 이외의 컬렉션 설정을 원하는 경우 구성 파일의 경로를 지정합니다. 시작, 연결 및 분석 명령에 적용됩니다. | XML 구성 파일의 디렉터리 경로 또는 상대 경로입니다. | 없음. |
구성 설정 사용자 지정
CVCollectionCmd를 사용하여 추적을 수집하고 컬렉션 설정을 사용자 지정하려는 경우 구성 파일을 사용하여 추적을 지정합니다.
비고
Visual Studio를 사용하여 추적을 수집하는 경우 구성 파일을 직접 수정하지 마세요. 대신 고급 설정 대화 상자를 사용하여 설정을 수정합니다.
컬렉션 설정을 수정하려면 CVCollectionCmd 유틸리티를 실행할 컴퓨터에 구성 파일을 만듭니다. 구성 파일을 처음부터 만들거나 Visual Studio가 설치된 컴퓨터에서 구성 파일을 복사하여 수정할 수 있습니다. 파일 이름은 UserConfig.xml로컬 AppData 폴더에 있습니다. 유틸리티를 실행할 때 시작, 연결 또는 분석 명령과 함께 구성 옵션을 사용합니다. 구성 옵션과 연결된 매개 변수에서 구성 파일의 경로를 지정합니다.
구성 파일 태그
구성 파일은 XML 기반입니다. 유효한 태그 및 값은 다음과 같습니다.
| Tag | Description | 가치들 |
|---|---|---|
| 설정 | 전체 구성 파일의 경계를 해제합니다. | 다음 요소를 포함해야 합니다. - 마이너 버전 - 주요 버전 |
| 주요 버전 (MajorVersion) | 구성 파일의 주 버전을 지정합니다. | 대부분의 Visual Studio 프로젝트에 대해 1이어야 합니다. 1이 아니면 유틸리티가 작동하지 않습니다. |
| 소형 버전 | 구성 파일의 부 버전을 지정합니다. | 대부분의 Visual Studio 프로젝트의 경우 0이어야 합니다. 0이 아니면 유틸리티가 작동하지 않습니다. |
| IncludeEnvSymbolPath | 환경 기호 경로(_NT_SYMBOL_PATH)가 사용되는지 여부를 결정하는 값을 설정합니다. | -참 - 거짓 |
| 분석 후 ETL 삭제 | 분석이 완료될 때 ETL 파일이 삭제되는지 여부를 결정하는 값을 설정합니다. | - 참(true) - 거짓 |
| 심볼 경로 | 기호 서버의 경로를 지정합니다. 자세한 내용은 Microsoft 기호 서버를 사용하여 디버그 기호 파일을 가져옵니다. | 디렉터리 이름 또는 URL입니다. |
| 마커 | 표식 공급자 목록을 포함합니다. | 0개 이상의 MarkerProvider 요소를 포함할 수 있습니다. |
| MarkerProvider | 단일 표식 공급자를 지정합니다. | 다음 요소를 포함해야 합니다. -수준 - GUID - 이름 다음 요소를 포함할 수 있습니다. -카테고리 - IsEnabled (활성화 여부) |
| Level | MarkerProvider의 중요도 수준을 설정합니다. | -낮다 -보통 -높음 -비판적인 -모두 |
| 가이드 | ETW 마커 공급자의 전역적으로 고유한 식별자입니다. | GUID입니다. |
| 이름 | 표식 공급자에 대한 설명을 지정합니다. | 문자열입니다. |
| 카테고리 | 표식 공급자에 대해 수집된 범주를 지정합니다. | 숫자 또는 숫자 범위의 쉼표로 구분된 문자열입니다. |
| 활성화됨 | 표식 공급자를 컬렉션에 사용할 수 있는지 여부를 결정하는 값을 설정합니다. | - 참(true) - 거짓 |
| FilterConfig | 컬렉션에서 필터링되는 ETW 이벤트의 구성 옵션 목록을 지정합니다. | 다음 요소를 포함할 수 있습니다. - CollectClrEvents (CLR 이벤트 수집) - ClrCollectionOptions - CollectSampleEvents - GPU 이벤트 수집 - CollectFileIO |
| CollectClrEvents | CLR 이벤트가 수집되는지 여부를 결정하는 값을 설정합니다. | - 참(true) - 거짓 |
| ClrCollectionOptions | 네이티브 앱에 대한 CLR 이벤트를 수집할지 여부와 NGEN 런다운 이벤트를 수집할지 여부를 지정합니다. | 다음 값 중 하나, 둘 다 또는 없음을 포함할 수 있습니다. - CollectForNative - DisableNGenRundown |
| CollectSampleEvents | 샘플 이벤트가 수집되는지 여부를 결정하는 값을 설정합니다. | - 참(true) - 거짓 |
| GPU이벤트수집 | DX에서 생성된 이벤트가 수집되는지 여부를 결정하는 값을 설정합니다. | - 참(true) - 거짓 |
| CollectFileIO | 파일 I/O 이벤트가 수집되는지 여부를 결정하는 값을 설정합니다. | - 참(true) - 거짓 |
| UserBuffer 설정 | 사용자 버퍼 설정 매개 변수 목록을 지정합니다. | 다음 요소를 포함해야 합니다. - BufferFlushTimer - 버퍼 크기 (BufferSize) - 최소 버퍼(MinimumBuffers) - 최대 버퍼 |
| 커널버퍼설정 | 커널 버퍼 설정 매개 변수 목록을 지정합니다. | 다음 요소를 포함해야 합니다. - BufferFlushTimer (버퍼 플러시 타이머) - 버퍼 크기 (BufferSize) - MinimumBuffers - 최대버퍼 |
| 버퍼 플러시 타이머 (BufferFlushTimer) | ETW 버퍼의 플러시 타이머를 지정합니다. | 양의 정수입니다. |
| 버퍼 크기 | 각 이벤트 추적 세션 버퍼에 할당된 메모리 양(킬로바이트)입니다. | 0에서 1024까지의 숫자입니다. |
| MinimumBuffers | 이벤트 추적 세션의 버퍼 풀에 할당된 최소 버퍼 수입니다. | 이는 논리 코어 수의 두 배 이상인 양의 정수입니다. |
| 최대 버퍼 | 이벤트 추적 세션의 버퍼 풀에 할당된 최대 버퍼 수입니다. | MinimumBuffers보다 크거나 같은 숫자입니다. |
| JustMyCode | 내 코드만 디렉터리 목록을 지정합니다. | 0개 이상의 MyCodeDirectory 요소 목록입니다. |
| MyCodeDirectory | 코드를 포함하는 디렉터리를 지정합니다. | 절대 경로 |
Example
처음부터 구성 파일을 만드는 대신 다음 예제를 복사한 다음 요구 사항에 맞게 수정할 수 있습니다.
<?xml version="1.0"?>
<LocalConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" MajorVersion="1" MinorVersion="0">
<IncludeEnvSymbolPath>true</IncludeEnvSymbolPath>
<DeleteEtlsAfterAnalysis>true</DeleteEtlsAfterAnalysis>
<TraceLocation>C:\traces</TraceLocation>
<SymbolPath>http://symweb</SymbolPath>
<Markers>
<MarkerProvider Name="Default" Guid="8d4925ab-505a-483b-a7e0-6f824a07a6f0" Level="Low" />
<MarkerProvider Name="TPL" Guid="2e5dba47-a3d2-4d16-8ee0-6671ffdcd7b5" Level="Normal" />
<MarkerProvider Name="TPL Dataflow" Guid="16f53577-e41d-43d4-b47e-c17025bf4025" Level="Normal" />
<MarkerProvider Name="TPL Synchronization" Guid="ec631d38-466b-4290-9306-834971ba0217" Level="Normal" />
<MarkerProvider Name="PLINQ" Guid="159eeeec-4a14-4418-a8fe-faabcd987887" Level="Normal" />
<MarkerProvider Name="Concurrency Runtime" Guid="f7b697a3-4db5-4d3b-be71-c4d284e6592f" Level="Normal" />
<MarkerProvider Name="Scenario Markers" Guid="fb9244c9-f23a-4966-8a9c-97a51f8c355b" Level="Low" />
<!-- The IsEnabled and Categories elements are optional -->
<MarkerProvider Name="myMarker1" Guid="d0dbb3a3-895c-4ce6-96d9-28f69d664dc3" Level="Critical" IsEnabled="false" Categories="0,1,3-5,8" />
<MarkerProvider Name="myMarker2" Guid="03452127-a617-4302-9e30-c0d10442e4ee" Level="Low" IsEnabled="false" Categories="0,1,3-5,8-10,11-13" />
</Markers>
<FilterConfig>
<CollectClrEvents>true</CollectClrEvents>
<ClrCollectionOptions>CollectForNative DisableNGenRundown</ClrCollectionOptions>
<CollectSampleEvents>true</CollectSampleEvents>
<CollectGpuEvents>true</CollectGpuEvents>
<CollectFileIO>true</CollectFileIO>
</FilterConfig>
<UserBufferSettings>
<BufferFlushTimer>0</BufferFlushTimer>
<BufferSize>256</BufferSize>
<MinimumBuffers>512</MinimumBuffers>
<MaximumBuffers>1024</MaximumBuffers>
</UserBufferSettings>
<KernelBufferSettings>
<BufferFlushTimer>0</BufferFlushTimer>
<BufferSize>256</BufferSize>
<MinimumBuffers>512</MinimumBuffers>
<MaximumBuffers>1024</MaximumBuffers>
</KernelBufferSettings>
<!-- List of MyCodeDirectory directories -->
<JustMyCode>
<MyCodeDirectory>C:\myBinaries1</MyCodeDirectory>
<MyCodeDirectory>C:\myBinaries2</MyCodeDirectory>
</JustMyCode>
</LocalConfig>