다음을 통해 공유


간접 표시 드라이버 디버깅

IDD(간접 표시 드라이버)는 UMDF 드라이버입니다. 따라서 UMDF 드라이버 로드에 실패하거나 UMDF 디바이스가시작하지 못하는 이유 확인과 같은 UMDF 디버깅 설명서가 좋은 시작점입니다. 이 페이지에서는 간접 표시 관련 디버깅 정보를 제공합니다.

레지스트리 제어

간접 디스플레이 드라이버 클래스 확장(IddCx)에는 간접 디스플레이 드라이버를 디버깅하는 데 사용할 수 있는 몇 가지 레지스트리 설정이 있습니다. 모든 레지스트리 값은 HKLM\System\CurrentControlSet\Control\GraphicsDrivers 레지스트리 키 아래에 있습니다.

값 이름 세부 정보
스톨 시 간접 종료 0 값은 프레임이 사용 가능한 후 10초 이내에 처리되지 않으면 드라이버를 종료하는 감시 장치를 비활성화합니다. 다른 모든 값은 감시자를 활성화된 상태로 유지합니다.
IddCxDebugCtrl IddCx의 다양한 디버그 기능을 활성화하는 비트 필드입니다. 다음 표를 참조하세요.

메모

TerminateIndirectOnStall 레지스트리 값을 사용하여 watchdog를 사용하지 않도록 설정하면 HLK 테스트가 실패합니다.

IddCxDebugCtrl 값

IddCxDebugCtrl의 비트 의미
0x0001 IddCx에서 오류를 감지하면 디버거에 침입
0x0002 IddCx가 로드될 때 디버거에 침입
0x0004 IddCx가 언로드될 때 디버거에 침입
0x0008 IddCx DriverEntry가 호출될 때 디버거에 침입
0x0010 드라이버 바인딩이 호출될 때 디버거로 진입하십시오.
0x0020 드라이버 시작이 호출될 때 디버거에 침입
0x0040 드라이버 바인딩 해제가 호출될 때 디버거에 침입
0x0080 DDI 호출에서 드라이버가 너무 오래 걸리면 종료되는 DDI Watchdog를 사용하지 않도록 설정합니다.
0x0100 사용하지 않는
0x0200 디버그 오버레이를 사용하도록 설정합니다. 다음 참고 사항을 참조하세요.
0x0400 프레임의 더티 사각형 위에 색이 지정된 알파 상자를 오버레이합니다. 0x0200 설정해야 합니다.
0x0800 프레임에 성능 통계를 오버레이하다
0x2000 IddCx는 프레임마다 캡처 프레임 레지스트리 값을 쿼리합니다. 0x0200 설정해야 합니다.

메모

오버레이 함수가 작동하려면, 드라이버에서 만든 Direct3D 디바이스를 IddCxSwapChainSetDevice에 전달하고, D3D11_CREATE_DEVICE_BGRA_SUPPORT 플래그로 설정해야 합니다.

IddCx WPP 추적

Iddcx는 WPP 인프라 사용하여 디버그 정보를 기록합니다. WPP 정보는 파일에 캡처할 수 있으며 이 캡처가 진행 중인 동안 커널 디버거에 표시될 수 있습니다.

IddCx WPP 추적 캡처

WPP 추적을 사용하도록 설정하는 방법에는 여러 가지가 있습니다. 한 가지 편리한 방법은 logman.exe 프로그램에서 빌드를 사용하는 것입니다. 다음 줄을 배치 파일에 복사하고 관리자 권한 명령 프롬프트에서 실행하면 IddCx WPP 추적 정보를 IddCx.etl 파일로 수집합니다.

@echo off  
echo Starting WPP tracing....
logman create trace IddCx -o IddCx.etl -ets -ow -mode sequential -p  {D92BCB52-FA78-406F-A9A5-2037509FADEA} 0x4f4 0xFF
echo Tracing enabled
pause
echo Stopping WPP tracing....
logman -stop IddCx -ets

캡처되는 내용을 제어하기

logman.exeFlags 매개 변수(이 경우 0x4f4)는 IddCx에서 기록하는 WPP 메시지를 제어합니다. 플래그의 의미는 Windows 빌드 19041 이상에서 변경될 있습니다.

Windows 빌드 19041 이상에 대한 플래그 의미

Flags 매개 변수는 비트 필드이며, 각 비트는 해당 유형의 메시지를 캡처할지 여부를 제어합니다.

플래그 비트 캡처된 메시지 유형
0x001 사용하지 않은
0x002 사용하지 않음
0x004 오류
0x008 디버그 오버레이를 D3D11_CREATE_DEVICE_BGRA_SUPPORT 없이 설정한 경우와 같은 무해한 오류
0x010 IddCx 개체
0x020 IddCx에 대한 UMDF 프레임워크 호출
0x040 IddCx에서 드라이버로 DDI 호출
0x080 드라이버에서 IddCx로의 낮은 빈도 호출
0x100 드라이버에서 IddCx로의 빈번한 프레임 관련 호출
0x200 드라이버에서 IddCx로의 잦은 커서 관련 호출
0x400 커널에서 IddCx로의 호출
0x800 IddCx에서 커널로의 함수 호출

일반적인 0x0f4 로깅 시나리오는 좋은 시작점입니다. 프레임 정보당 보려는 경우 0x1f4 좋은 시작점입니다.

Windows 빌드 19041 이전의 플래그 의미

플래그는 수준으로 처리되었고, 각 수준 증가는 이전 수준의 모든 메시지와 함께 새 유형의 메시지를 추가했습니다.

플래그 수준 값 캡처된 메시지 유형
1 사용되지 않음
2 오류
3 경고
4 정보
5 장황한

IddCx WPP 추적 디코딩

모든 WPP 추적과 마찬가지로 WPP 정보는 pdb 파일에 저장됩니다. 따라서 디코딩하려면 해당 정보를 포함한 pdb 파일에 대한 액세스가 필요합니다. Windows 빌드 19560부터 공용 기호 서버의 IddCx.pdb에는 WPP 메시지를 디코딩하는 데 필요한 WPP 정보가 포함되어 있습니다. Windows 빌드 19560 이전 공용 기호 서버의 IddCx.pdb에는 WPP 디코딩에 필요한 WPP 정보가 포함되어 있지 않습니다.

표준 WPP 디코딩 도구를 사용하여 메시지를 디코딩하고 표시할 수 있습니다.

IddCx 오류 디버깅

IDD를 개발하는 동안 IddCx에서 오류를 감지할 때 추가 정보를 가져오는 것이 유용한 경우가 많습니다. 앞에서 설명한 대로 IddCx에서 오류를 감지할 때 디버거에 침입하도록 IddCx를 구성할 수 있지만, 지난 몇 개의 추적 메시지에서 IddCx 오류 메시지를 표시하여 오류의 컨텍스트를 이해하는 것도 유용합니다.

이전 섹션을 사용하여 logman.exe 사용하여 WPP 추적을 사용하도록 설정할 수 있으며 다음 정보를 통해 오류 시점에 커널 디버거의 메모리 내 WPP 버퍼를 표시할 수 있습니다.

메모

이 작업을 수행하려면 디버거가 WPP 디코딩 정보가 포함된 IddCx.pdb 가져오려면 커널 디버거(사용자 모드 디버거 아님) 및 Windows 빌드 19560 이상을 사용해야 합니다.

다음 예제에서 IDD는 IddCxMonitorArrival을 호출합니다. 처리의 일환으로 IddCx는 드라이버의 EvtIddCxMonitorQueryTargetModes DDI를 호출합니다. 이 예제에서 드라이버는 DISPLAYCONFIG_VIDEO_SIGNAL_INFO 있는 모드를 반환했습니다. AdditionalSignalInfo.vSyncFreqDivider가 0으로 설정되어 유효하지 않으며 오류가 발생합니다.

사용되는 디버거 명령 목록은 다음과 같습니다.

명령 의미
!wmitrace.bufdump 이름과 함께 모든 로깅 버퍼를 나열합니다. IddCx는 logman.exe 명령줄에서 얻은 이름입니다.
!wmitrace.logdump LogBufferName 다음 예제에서 IddCx인 지정된 로깅 버퍼의 콘텐츠를 디코딩하고 표시합니다.

이 예제의 디버거 출력은 다음과 같습니다.

0: kd> !wmitrace.bufdump
(WmiTrace) BufDump
    LoggerContext Array @ 0xFFFFE6055EB0AC40 [64 Elements]

 Logger Context  Number Available   Size    NPP Usage   PP Usage
================ ====== ========= ======== =========== ==========
ffffe6055ee6c800      4         2     4096       16384             Circular Kernel Context Logger
ffffe6055eaa8640      2         2    65536      131072             Eventlog-Security
ffffe6055eb83a00      2         1    65536      131072             DefenderApiLogger
ffffe6055ebb6a00      2         2    65536      131072             DefenderAuditLogger
ffffe6055eb74040      2         1    16384       32768             DiagLog
ffffe6055eb74640      4         2    65536      262144             Diagtrack-Listener
ffffe6055eaa8040      2         2    65536                 131072  EventLog-Application
ffffe6055eb7c040      2         1    65536      131072             EventLog-System
ffffe6055eb7c640      5         3    65536      327680             LwtNetLog
ffffe6055eb85040      4         2    65536      262144             Microsoft-Windows-Rdp-Graphics-RdpIdd-Trace
ffffe6055eb85680      8         6   131072     1048576             NetCore
ffffe6055eb89040      4         4     4096       16384             NtfsLog
ffffe6055eb89640      8         6   131072     1048576             RadioMgr
ffffe605683ef040      3         2     4096                  12288  WindowsUpdate_trace_log
ffffe6055eb8f640      2         2     2048        4096             UBPM
ffffe6055eb108c0      4         2    16384       65536             WdiContextLog
ffffe6055eb968c0      4         2    81920      327680             WiFiSession
ffffe60567e8a6c0      5         3     8192       40960             IddCx
ffffe605658379c0     10         9     3072       30720             umstartup
ffffe605659d4840     10         9   131072     1310720             SCM
ffffe605655af9c0      2         1    65536      131072             UserNotPresentTraceSession
ffffe605659d6840      2         1     4096        8192             COM
ffffe60565925080     10         8    20480      204800             Terminal-Services-LSM
ffffe60565956080     10         9    20480      204800             Terminal-Services-RCM
ffffe6055eba39c0     50        49     3072      153600             UserMgr
ffffe60567388280      2         2    32768       65536             WFP-IPsec Diagnostics
ffffe605678a3040      5         3     4096       20480             MpWppTracing-20200424-092923-00000003-ffffffff
ffffe60567e35080      2         1    65536      131072             ScreenOnPowerStudyTraceSession
ffffe605655e0a00      5         3     4096       20480             SHS-04242020-092951-7-7f
ffffe605692054c0      4         4     8192       32768             RdpIdd
ffffe60567f597c0      4         3    65536      262144             SgrmEtwSession
ffffe605678a9a00      4         4     8192       32768             DispBrok-DeskSrv
ffffe60569286680      4         4     8192       32768             DispBrok-Desk
ffffe605668026c0      4         4     8192       32768             DispBrok
================ ====== ========= ======== =========== ==========
                    195       159             6651904     143360

0: kd> !wmitrace.logdump IddCx
(WmiTrace) LogDump for Logger Id 0x13
Found Buffers: 5 Messages: 537, sorting entries
[1]0EF8.0CF0::04/24/2020-09:43:36.894 [cx][IddCx]DriverEntry: Enter
[1]0EF8.0CF0::04/24/2020-09:43:36.897 [cx][IddCx]?IddCxLibraryInitialize@@YAJXZ: Enter
[1]0EF8.0CF0::04/24/2020-09:43:36.897 [cx][IddCx]?IddCxLibraryInitialize@@YAJXZ: Exit
[1]0EF8.0CF0::04/24/2020-09:43:36.897 [cx][IddCx]DriverEntry: Exit, status=STATUS_SUCCESS
[0]0EF8.0CF0::04/24/2020-09:43:36.904 [cx][IddCx]?IddCxLibraryBindClient@@YAJPEAU_WDF_CLASS_BIND_INFO@@PEAPEAX@Z: Enter
[0]0EF8.0CF0::04/24/2020-09:43:36.904 [cx][IddCx]?IddCxLibraryBindClient@@YAJPEAU_WDF_CLASS_BIND_INFO@@PEAPEAX@Z: Exit, status=STATUS_SUCCESS
[0]0EF8.0CF0::04/24/2020-09:43:36.910 [cx][IddCx]IddCxImplDeviceInitConfig: Enter
[0]0EF8.0CF0::04/24/2020-09:43:36.910 [cx][IddCx]IddCxImplDeviceInitConfig: Exit, status=STATUS_SUCCESS
[0]0EF8.0CF0::04/24/2020-09:43:36.910 [cx][IddCx]IddCxImplGetVersion: Enter
[0]0EF8.0CF0::04/24/2020-09:43:36.910 [cx][IddCx]IddCxImplGetVersion: Exit, status=STATUS_SUCCESS
[0]0EF8.0CF0::04/24/2020-09:43:36.911 [cx][IddCx]IddCxImplDeviceInitialize: Enter
[0]0EF8.0CF0::04/24/2020-09:43:36.912 [cx][IddCx]IddCxImplDeviceInitialize: New IddDevice 0x000001642F5E0770 created
[0]0EF8.0CF0::04/24/2020-09:43:36.912 [cx][IddCx]IddCxImplDeviceInitialize: Exit, status=STATUS_SUCCESS
[0]0EF8.0CF0::04/24/2020-09:43:36.917 [cx][IddCx]IddCxImplAdapterInitAsync: Enter
[0]0EF8.0CF0::04/24/2020-09:43:36.917 [cx][IddCx]?Init@IddAdapter@@QEAAXPEAUIDDCX_ADAPTER__@@PEAVIddDevice@@PEAUIDDCX_ADAPTER_CAPS@@@Z: New IddAdapter 0x000001642F5E77D0 created, API object 0xFFFFFE9BD0A18978, IddDevice 0x000001642F5E0770
[0]0EF8.0CF0::04/24/2020-09:43:36.917 [cx][IddCx]?SendUserModeMessage@IddAdapter@@QEAAJIPEAXI0W4DXGK_IDD_ESCAPE_CODE@@PEAI@Z: Sending escape 0x0 to kernel
Unknown( 76): GUID=ac5ec775-ccdb-3c2c-6150-28b4eacacbc4 (No Format Information found).
[0]0EF8.0CF0::04/24/2020-09:43:36.917 [cx][IddCx]IddCxImplAdapterInitAsync: Exit, status=STATUS_SUCCESS
[0]0EF8.0558::04/24/2020-09:43:36.935 [cx][IddCx]?HandleKernelModeMessage@IddAdapter@@QEAAXIPEAXI0PEAI@Z: IddAdapter 0x000001642F5E77D0, processing command START_ADAPTER_COMPLETE from KMD
[0]0EF8.0558::04/24/2020-09:43:36.935 [cx][IddCx]?HandleKernelModeMessage@IddAdapter@@QEAAXIPEAXI0PEAI@Z: IddAdapter 0x000001642F5E77D0, Successful adapter start, Wddm Luid = 0xe6e90, Adapter caps 0x0, Session Id 0, Terminal Luid 0x0
[0]0EF8.0558::04/24/2020-09:43:36.935 [cx][IddCx]?HandleKernelModeMessage@IddAdapter@@QEAAXIPEAXI0PEAI@Z: Exit
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]<lambda_e42696d61f3ea0fd0d39fdb90d856b7b>::operator(): DDI: Calling EvtIddCxAdapterInitFinished DDI, IddAdapter 0xFFFFFE9BD0A18978
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]IddCxImplMonitorCreate: Enter
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]IddCxImplMonitorCreate: New IddMonitor 0x000001642F5EF720 created, API object 0xFFFFFE9BD0A11A38, IddAdapter 0x000001642F5E77D0
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]IddCxImplMonitorCreate: Exit, status=STATUS_SUCCESS
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]IddCxImplMonitorArrival: Enter
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?ParseMonitorDescription@IddDevice@@QEAAXUIDDCX_MONITOR_DESCRIPTION@@AEAV?$vector@UIDDCX_MONITOR_MODE@@V?$allocator@UIDDCX_MONITOR_MODE@@@std@@@std@@AEAI@Z: DDI: Calling EvtIddCxParseMonitorDescriptio DDI to get mode count, Device 0x000001642F5E0770
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?ParseMonitorDescription@IddDevice@@QEAAXUIDDCX_MONITOR_DESCRIPTION@@AEAV?$vector@UIDDCX_MONITOR_MODE@@V?$allocator@UIDDCX_MONITOR_MODE@@@std@@@std@@AEAI@Z: DDI: Return successfully from EvtIddCxParseMonitorDescriptio DDI to get mode count, mode count 23
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?ParseMonitorDescription@IddDevice@@QEAAXUIDDCX_MONITOR_DESCRIPTION@@AEAV?$vector@UIDDCX_MONITOR_MODE@@V?$allocator@UIDDCX_MONITOR_MODE@@@std@@@std@@AEAI@Z: DDI: Calling EvtIddCxParseMonitorDescriptio DDI to get modes, Device 0x000001642F5E0770
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?ParseMonitorDescription@IddDevice@@QEAAXUIDDCX_MONITOR_DESCRIPTION@@AEAV?$vector@UIDDCX_MONITOR_MODE@@V?$allocator@UIDDCX_MONITOR_MODE@@@std@@@std@@AEAI@Z: DDI: Return successfully from EvtIddCxParseMonitorDescriptio DDI to get modes
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?AddMonitorModes@IddMonitor@@AEAAXAEAV?$vector@UTARGET_MONITOR_MODE@@V?$allocator@UTARGET_MONITOR_MODE@@@std@@@std@@@Z: IddMonitor 0x000001642F5EF720, parseMonitorDescription returned 23 modes.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?QueryModes@IddMonitor@@AEAAXAEAV?$vector@UIDDCX_TARGET_MODE@@V?$allocator@UIDDCX_TARGET_MODE@@@std@@@std@@@Z: DDI: Calling EvtIddCxMonitorQueryTargetModes DDI for mode count, IddMonitor 0x000001642F5EF720
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?QueryModes@IddMonitor@@AEAAXAEAV?$vector@UIDDCX_TARGET_MODE@@V?$allocator@UIDDCX_TARGET_MODE@@@std@@@std@@@Z: DDI: Return successfully from EvtIddCxMonitorQueryTargetModes DDI, mode count = 0x23
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?QueryModes@IddMonitor@@AEAAXAEAV?$vector@UIDDCX_TARGET_MODE@@V?$allocator@UIDDCX_TARGET_MODE@@@std@@@std@@@Z: DDI: Calling EvtIddCxMonitorQueryTargetModes DDI to get modes, IddMonitor 0x000001642F5EF720
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?QueryModes@IddMonitor@@AEAAXAEAV?$vector@UIDDCX_TARGET_MODE@@V?$allocator@UIDDCX_TARGET_MODE@@@std@@@std@@@Z: DDI: Return successfully from EvtIddCxMonitorQueryTargetModes DDI
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?StartWatchInternal@IddWatchdog@@AEAAXK@Z: IddWatchdog 0x000001642F5E77F0, still has pending watch not started by watchdog thread.
[0]0EF8.1588::04/24/2020-09:43:36.936 [cx][IddCx]?AddTargetModes@IddMonitor@@AEAAXAEAV?$vector@UTARGET_MONITOR_MODE@@V?$allocator@UTARGET_MONITOR_MODE@@@std@@@std@@@Z: IddMonitor 0x000001642F5EF720, queryTargetModes returned 23 modes.
[0]0EF8.1588::04/24/2020-09:43:55.341 [cx][IddCx] Throwing error (Status 0xc000000d(STATUS_INVALID_PARAMETER)) from function Validate in onecoreuap\windows\core\dxkernel\indirectdisplays\classext\cx\ddivalidation.cpp:412, Msg DISPLAYCONFIG_VIDEO_SIGNAL_INFO.AdditionalSignalInfo.vSyncFreqDivider cannot be zero for target mode
Total of 537 Messages from 5 Buffers

마지막 줄은 실패 이유를 제공합니다.

간접 디스플레이 화면 캡처 디버깅 기능

Windows 빌드 25164IddCx는 IddCx가 드라이버에 전달하는 데스크톱 프레임을 덤프할 수 있습니다. 이 기능은 시각적 문제를 디버그하는 데 사용할 수 있습니다. 프레임의 더티 영역 음영과 같은 디버그 오버레이와 결합할 수 있습니다.

IddCx는 모든 프레임에서 프레임 캡처에 대한 디버그 레지스트리 설정의 변경 내용을 찾습니다. 따라서 이 동작을 제어하는 IddCxDebugCtrl 마스터 컨트롤 값이 있습니다. 설정을 비활성화해도 성능 저하가 발생하지 않도록 보장합니다.

메모

이 기능은 OPM 인터페이스가 드라이버에 활성 상태일 때 사용하지 않도록 설정됩니다.

캡처를 제어하는 레지스트리 값

다음 레지스트리 값은 HKLM\System\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture에 위치해 있습니다. IddCxDebugCtrl 값을 설정하기 전에 이 레지스트리 폴더를 만들어야 합니다.

이름 누락된 경우 기본값 의미
TriggerUniqueness 0 새 프레임을 획득하기 위해 각 IddCx 스왑 체인이 호출되면 이 값을 읽습니다. TriggerUniqueness가 0이 아니고 이전에 읽은 값과 다른 경우, 아래 값들이 읽히고 프레임 캡처가 활성화됩니다.
TargetMask 0xffff 비트 마스크는 해당 대상의 스왑 체인이 이 캡처 시퀀스의 일부여야 하는지 여부를 제어하는 어댑터의 각 대상 인덱스에 대해 1비트입니다.
캡처 수 10 캡처할 수 있는 각 IddCx 스왑 체인이 캡처해야 하는 프레임 수입니다.
프레임 건너뛰기 0 캡처된 각 프레임 간에 건너뛸 프레임 수입니다.
CaptureSessionID 0 프레임 캡처를 사용할 세션입니다. 값이 0이면 항상 콘솔 세션을 의미합니다.
ScaleFactor 100 캡처된 파일의 크기, 유효한 값 1-100을 결정하는 데 사용되는 배율 인수를 제어합니다.
캡처폴더 c:\IddCxImages 캡처 파일이 기록될 폴더입니다. c:\IddCxImages 폴더가 없으면 생성될 것입니다.

캡처 매개 변수는 캡처 세션이 특정 대상의 모드 변경을 포함할 수 있도록 각 대상에 따라 저장됩니다.

모니터 개체가 이전 캡처에서 프레임을 캡처하는 동안 0이 아닌 새 TriggerUniqueness 값이 감지되면 현재 캡처를 중지하고 새로 트리거된 캡처를 시작합니다.

REG 파일을 사용하여 프레임 캡처 제어

REG 파일은 프레임 캡처를 제어하는 좋은 방법입니다. 한 파일은 초기 값을 설정할 수 있고 다른 파일은 TriggerUniqueness를 업데이트할 수 있습니다.

초기 값을 설정하는 REG 파일

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers]
"IddCxDebugCtrl"=dword:2200

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"TriggerUniqueness"=dword:0

TriggerUniqueness를 업데이트하는 REG 파일

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"TriggerUniqueness"=dword:1

파일 이름 및 형식

캡처된 프레임은 다음 파일 이름 형식의 PNG 파일 형식입니다.

S<세션 ID, 콘솔일 경우 0>_Ad<ID 어댑터 LUID의 16진수 값>_T<ID 대상 인덱스의 16진수 값>_Frame<IDDCX_METADATA.PresentationFrameNumber의 프레임 번호>_<날짜(mmddyy 형식)>_<시간(hhmmss 형식)>.png

다음은 몇 가지 예제 파일 이름입니다.

  • S0_Ad8ade_T3_Frame2343_020422_173434.png
  • S0_Ad8ade_T3_Frame2344_020422_173434.png
  • S0_Ad8ade_T3_Frame2345_020422_173435.png

WPP 로깅

시작된 각 캡처 세션에 대해 WPP 메시지는 레지스트리에서 읽은 값이나 기본 설정 값 각각에 대해 기록됩니다.

프레임을 캡처하고 파일에 쓸 때마다 IddCx는 이미지 파일의 전체 파일 이름을 포함하는 WPP 메시지를 추가합니다.

캡처 설정 예제

모니터가 처음 연결된 시점부터 프레임 캡처

다음은 모니터가 처음 연결될 때의 처음 20프레임과 REG 파일을 캡처하는 데 필요한 레지스트리 값입니다.

레지스트리 항목 메모
포착 횟수 20 기본 10이 아닌 20프레임 설정
TriggerUniqueness 1 0이 아닌 값은 대상 개체가 저장소 고유성으로 0으로 시작될 때 작동합니다.
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"CaptureCount"=dword:00000014
"TriggerUniqueness"=dword:00000001

모니터가 활성 상태일 때 캡처 시작

스왑 체인이 드라이버가 각 프레임을 획득할 때마다 새 고유성 값을 확인하므로, 모든 매개 변수가 예상대로 읽히도록 TriggerUniqueness 항목을 마지막에 설정해야 합니다. 다음 예제에서는 공간을 절약하기 위해 파일 해상도를 절반으로 줄이고 c:\frames 폴더에 캡처 파일을 씁니다.

레지스트리 항목 메모
캡처 카운트 100 기본 10이 아닌 100프레임 설정
ScaleFactor 50 50% 해상도를 설정하여 공간 절약
CaptureFolder c:\frames 출력 폴더 설정
트리거 고유성 1 0이 아닌 값은 대상 개체가 저장소 고유성으로 0으로 시작될 때 작동합니다.
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"CaptureCount"=dword:00000014
"CaptureFolder"="c:\\frames"
"ScaleFactor"=dword:00000032
"TriggerUniqueness"=dword:00000001

원격 세션 3에서 두 번째 대상으로부터 10프레임을, 각 캡처 사이에 5프레임 간격으로 캡처하세요

또한 이 캡처는 디버그 오버레이를 사용하여 각 프레임의 더티 영역을 강조 표시합니다.

레지스트리 항목 노트
IddCxDebugCtrl 비트 0x0400 또한 설정됨 0x0400은 더티 영역 강조 표시를 활성화하고, 0x2200 비트도 필요합니다.
CaptureSessionID 3 원격 세션 3에서 캡처를 사용할 수 있도록 활성화합니다.
타겟마스크 (TargetMask) 0x2 비트 1은 대상 Idx 1에 해당합니다.
프레임 건너뛰기 5 각 캡처 사이에 5개의 프레임 캡처 건너뛰기
트리거 고유성 1 0이 아닌 값은 대상 개체가 저장소 고유성으로 0으로 시작될 때 작동합니다.
Windows Registry Editor Version 5.00  

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers]  
"IddCxDebugCtrl"=dword:2600

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IddCxFrameCapture]
"CaptureSessionID"=dword:00000003
"TargetMask"=dword:00000002
"SkipFrames"=dword:00000005    
"TriggerUniqueness"=dword:00000001