다음을 통해 공유


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

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

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

커널 디버거가 연결된 모든 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 시작합니다.

  • UmdfHostProcessSharingProcessSharingDisabled로 설정하여 풀링을 사용하지 않도록 설정합니다. 자세한 내용은 INF 파일에서 WDF 지시문 지정을 참조하세요.

  • 기본적으로 UMDF 디바이스가 실패하면 프레임워크는 최대 5번 다시 시작하려고 시도합니다. DebugModeFlags를 0x01 설정하여 자동 다시 시작을 끌 수 있습니다. 자세한 내용은 WDF 드라이버 디버깅을 위한 레지스트리 값을 참조하세요.

  • 컴퓨터를 다시 부팅합니다.

  • UMDF 드라이버 문제를 디버깅하는 경우 Reflector가 호스트 프로세스를 종료한 이유 확인UMDF 드라이버 크래시 디버깅을 검토합니다.

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

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

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

다음 단계를 수행합니다.

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

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

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

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

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

원격 호스트에서 커널 모드 디버깅 세션을 설정한 다음 현재 프로세스를 드라이버를 호스팅하는 Wudfhost의 instance 설정합니다. 원격 커널 디버거에서 디버깅하는 경우 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. 위에서 선택한 항목에 따라 드라이버가 대상에 로드되거나 언로드될 때 원격 커널 디버거가 중단되어야 합니다.