UMDF 드라이버의 디버깅을 사용하도록 설정하는 방법

다음 구성을 사용하여 개발 중에 User-Mode 드라이버 프레임워크(UMDF) 드라이버를 디버그할 수 있습니다. 모든 구성에는 호스트와 대상이라는 두 개의 컴퓨터가 포함됩니다.

  • 수동으로 대상에 드라이버를 복사합니다. 대상에서 사용자 모드 디버깅을 수행합니다. 이 시나리오에서는 대상에서 실행되는 드라이버 호스트 프로세스의 인스턴스에 수동으로 연결합니다.
  • 수동으로 대상에 드라이버를 복사한 다음 호스트에서 커널 모드 디버깅을 수행합니다.

커널 디버거가 연결된 모든 UMDF 드라이버 테스트 및 개발을 수행하는 것이 좋습니다.

모범 사례

커널 디버거가 연결된 모든 UMDF 드라이버 테스트를 수행하는 것이 좋습니다.

권장되는 설정은 다음과 같습니다. 이러한 설정을 수동으로 설정하거나 WDK에서 WDF WDFVerifier.exe(Verifier Control Application ) 도구를 사용하여 이러한 설정을 보거나 변경할 수 있습니다.

WinDbg를 사용하여 수동으로 연결(사용자 모드 디버깅)

대상 컴퓨터에서 드라이버를 호스트하는 WUDFHost 인스턴스에 WinDbg를 수동으로 연결할 수 있습니다. 연결할 때 디버거에 침입하여 드라이버에 중단점을 설정할 수 있습니다.

드라이버 초기화는 WUDFHost가 로드된 직후에 발생하므로 초기화 코드를 디버그하기 위해 수동으로 연결하는 것은 불가능합니다. 대신 호스트 프로세스가 호스트 초기화 또는 드라이버 로드 시간에 몇 초를 대기하도록 레지스트리 값을 설정할 수 있습니다. 이 지연은 WINDbg를 WUDFHost 프로세스의 올바른 인스턴스에 연결할 시간을 제공합니다.

다음 단계를 수행합니다.

  1. 대상 컴퓨터의 레지스트리에서 HostProcessDbgBreakOnStart 또는 HostProcessDbgBreakOnDriverLoad 를 몇 초로 설정하고 다시 부팅합니다.
  2. 대상 컴퓨터에서 WinDbg를 관리자 권한으로 엽니다.
  3. [파일] 메뉴에서 [프로세스에 연결]을 선택합니다. 실행 파일로 선택하고 이름이 WUDFHost.exe 모든 프로세스를 찾습니다(없는 경우). WUDFHost.exe 명명된 프로세스가 있는 경우 이후 참조를 위해 해당 프로세스 식별자를 적어 씁니다.
  4. 장치 관리자 드라이버를 사용하도록 설정합니다.
  5. 2단계를 반복하고 WUDFHost.exe 새 인스턴스를 찾습니다. WUDFHost.exe 새 인스턴스가 표시되지 않으면 [취소]를 클릭하고 [프로세스에 연결]을 다시 선택합니다. WUDFHost.exe 새 인스턴스를 찾으면 해당 인스턴스를 선택하고 확인을 클릭합니다.

디바이스 풀링이 사용 중이고 HostProcessDbgBreakOnDriverLoad 레지스트리 값을 설정한 경우 다른 드라이버 로드로 인해 디버거 중단이 표시될 수 있습니다. UMDF 디버그 모드를 사용하여 디바이스 풀링을 해제할 수 있습니다.

디버그 모드를 사용하려면 Visual Studio F5 옵션을 사용하거나 레지스트리에서 DebugModeFlagsDebugModeBinaries 값을 설정합니다.

UMDF 레지스트리 값에 대한 자세한 내용은 WDF 드라이버 디버깅을 위한 레지스트리 값(KMDF 및 UMDF)을 참조하세요.

WinDbg를 사용하여 호스트 컴퓨터에서 원격으로 디버그(커널 모드 디버깅)

원격 호스트에서 커널 모드 디버깅 세션을 설정한 다음 현재 프로세스를 드라이버를 호스팅하는 Wudfhost 인스턴스로 설정합니다. 원격 커널 디버거에서 디버깅하는 경우 HostProcessDbgBreakOnDriverStart 또는 HostProcessDbgBreakOnDriverLoad 를 0x80000000 설정하여 시간 제한을 지정하지 않고 커널 디버거에 침입할 수 있습니다.

다음 단계를 사용:

  1. 풀링을 사용하지 않도록 설정합니다. DebugModeFlags를 켜고 DebugModeBinaries에 드라이버를 나열합니다.

  2. 드라이버에서 UMDF 1.11 이상을 사용하는 경우 HostFailKdDebugBreak 는 기본적으로 사용하도록 설정됩니다. 이 단계를 건너뜁니다.

    드라이버에서 UMDF 1.9 이하를 사용하는 경우 HostFailKdDebugBreak 를 1로 설정합니다.

  3. 시간 제한과 관련된 문제를 디버깅하는 경우 HostProcessDbgBreakOnDriverStartHostProcessDbgBreakOnDriverLoad를 해제합니다. HostProcessDbgBreakOnDriverStart 또는 HostProcessDbgBreakOnDriverLoad가 0이 아닌 경우 프레임워크는 사용자 모드 디버거가 호스트 프로세스에 연결된 동안 리플렉터가 호스트를 종료하지 않도록 시간 제한을 사용하지 않도록 설정합니다. 드라이버 초기화 코드를 디버그해야 하는 경우 이 두 값을 사용하는 대신 드라이버가 로드되기 전에 WinDbg에서 다음 명령을 실행합니다. sxe ld:MyDriver.dll (모듈 로드 시 중단)

  4. 레지스트리를 변경한 경우 다시 부팅합니다.

  5. 위에서 선택한 항목에 따라 드라이버가 대상에 로드하거나 언로드할 때 원격 커널 디버거가 중단됩니다.