UMDF 드라이버의 디버깅을 사용하도록 설정하는 방법
다음 구성을 사용하여 개발 중에 User-Mode 드라이버 프레임워크(UMDF) 드라이버를 디버그할 수 있습니다. 모든 구성에는 호스트와 대상이라는 두 개의 컴퓨터가 포함됩니다.
- 수동으로 대상에 드라이버를 복사합니다. 대상에서 사용자 모드 디버깅을 수행합니다. 이 시나리오에서는 대상에서 실행되는 드라이버 호스트 프로세스의 인스턴스에 수동으로 연결합니다.
- 수동으로 대상에 드라이버를 복사한 다음 호스트에서 커널 모드 디버깅을 수행합니다.
커널 디버거가 연결된 모든 UMDF 드라이버 테스트 및 개발을 수행하는 것이 좋습니다.
모범 사례
커널 디버거가 연결된 모든 UMDF 드라이버 테스트를 수행하는 것이 좋습니다.
권장되는 설정은 다음과 같습니다. 이러한 설정을 수동으로 설정하거나 WDK에서 WDF WDFVerifier.exe(Verifier Control Application ) 도구를 사용하여 이러한 설정을 보거나 변경할 수 있습니다.
WUDFHost.exe 애플리케이션 검증 도구 사용:
AppVerif –enable Heaps Exceptions Handles Locks Memory TLS Leak –for WudfHost.exe예외가 발생하면 Application Verifier가 진단 메시지를 디버거로 보내고 중단합니다.
커널 모드 디버깅 세션을 사용하는 경우 드라이버 호스트 프로세스를 종료하기 전에 리플렉터가 커널 모드 디버거에 침입하도록 HostFailKdDebugBreak 를 설정합니다. 이 설정은 기본적으로 Windows 8 시작됩니다.
UmdfHostProcessSharing을 ProcessSharingDisabled로 설정하여 풀링을 사용하지 않도록 설정합니다. 자세한 내용은 INF 파일에서 WDF 지시문 지정을 참조하세요.
기본적으로 UMDF 디바이스가 실패하면 프레임워크는 최대 5회까지 다시 시작하려고 시도합니다. DebugModeFlags를 0x01 설정하여 자동 다시 시작을 해제할 수 있습니다. 자세한 내용은 WDF 드라이버 디버깅에 대한 레지스트리 값을 참조하세요.
컴퓨터를 다시 부팅합니다.
UMDF 드라이버 문제 디버깅의 경우 Reflector가 호스트 프로세스를 종료한 이유 및 UMDF 드라이버 디버깅 크래시를 확인하는 방법을 검토합니다.
WinDbg를 사용하여 수동으로 연결(사용자 모드 디버깅)
대상 컴퓨터에서 드라이버를 호스트하는 WUDFHost 인스턴스에 WinDbg를 수동으로 연결할 수 있습니다. 연결할 때 디버거에 침입하여 드라이버에 중단점을 설정할 수 있습니다.
드라이버 초기화는 WUDFHost가 로드된 직후에 발생하므로 초기화 코드를 디버그하기 위해 수동으로 연결하는 것은 불가능합니다. 대신 호스트 프로세스가 호스트 초기화 또는 드라이버 로드 시간에 몇 초를 대기하도록 레지스트리 값을 설정할 수 있습니다. 이 지연은 WINDbg를 WUDFHost 프로세스의 올바른 인스턴스에 연결할 시간을 제공합니다.
다음 단계를 수행합니다.
- 대상 컴퓨터의 레지스트리에서 HostProcessDbgBreakOnStart 또는 HostProcessDbgBreakOnDriverLoad 를 몇 초로 설정하고 다시 부팅합니다.
- 대상 컴퓨터에서 WinDbg를 관리자 권한으로 엽니다.
- [파일] 메뉴에서 [프로세스에 연결]을 선택합니다. 실행 파일로 선택하고 이름이 WUDFHost.exe 모든 프로세스를 찾습니다(없는 경우). WUDFHost.exe 명명된 프로세스가 있는 경우 이후 참조를 위해 해당 프로세스 식별자를 적어 씁니다.
- 장치 관리자 드라이버를 사용하도록 설정합니다.
- 2단계를 반복하고 WUDFHost.exe 새 인스턴스를 찾습니다. WUDFHost.exe 새 인스턴스가 표시되지 않으면 [취소]를 클릭하고 [프로세스에 연결]을 다시 선택합니다. WUDFHost.exe 새 인스턴스를 찾으면 해당 인스턴스를 선택하고 확인을 클릭합니다.
디바이스 풀링이 사용 중이고 HostProcessDbgBreakOnDriverLoad 레지스트리 값을 설정한 경우 다른 드라이버 로드로 인해 디버거 중단이 표시될 수 있습니다. UMDF 디버그 모드를 사용하여 디바이스 풀링을 해제할 수 있습니다.
디버그 모드를 사용하려면 Visual Studio F5 옵션을 사용하거나 레지스트리에서 DebugModeFlags 및 DebugModeBinaries 값을 설정합니다.
UMDF 레지스트리 값에 대한 자세한 내용은 WDF 드라이버 디버깅을 위한 레지스트리 값(KMDF 및 UMDF)을 참조하세요.
WinDbg를 사용하여 호스트 컴퓨터에서 원격으로 디버그(커널 모드 디버깅)
원격 호스트에서 커널 모드 디버깅 세션을 설정한 다음 현재 프로세스를 드라이버를 호스팅하는 Wudfhost 인스턴스로 설정합니다. 원격 커널 디버거에서 디버깅하는 경우 HostProcessDbgBreakOnDriverStart 또는 HostProcessDbgBreakOnDriverLoad 를 0x80000000 설정하여 시간 제한을 지정하지 않고 커널 디버거에 침입할 수 있습니다.
다음 단계를 사용:
풀링을 사용하지 않도록 설정합니다. DebugModeFlags를 켜고 DebugModeBinaries에 드라이버를 나열합니다.
드라이버에서 UMDF 1.11 이상을 사용하는 경우 HostFailKdDebugBreak 는 기본적으로 사용하도록 설정됩니다. 이 단계를 건너뜁니다.
드라이버에서 UMDF 1.9 이하를 사용하는 경우 HostFailKdDebugBreak 를 1로 설정합니다.
시간 제한과 관련된 문제를 디버깅하는 경우 HostProcessDbgBreakOnDriverStart 및 HostProcessDbgBreakOnDriverLoad를 해제합니다. HostProcessDbgBreakOnDriverStart 또는 HostProcessDbgBreakOnDriverLoad가 0이 아닌 경우 프레임워크는 사용자 모드 디버거가 호스트 프로세스에 연결된 동안 리플렉터가 호스트를 종료하지 않도록 시간 제한을 사용하지 않도록 설정합니다. 드라이버 초기화 코드를 디버그해야 하는 경우 이 두 값을 사용하는 대신 드라이버가 로드되기 전에 WinDbg에서 다음 명령을 실행합니다. sxe ld:MyDriver.dll (모듈 로드 시 중단)
레지스트리를 변경한 경우 다시 부팅합니다.
위에서 선택한 항목에 따라 드라이버가 대상에 로드하거나 언로드할 때 원격 커널 디버거가 중단됩니다.