다음을 통해 공유


프레임워크의 이벤트 로거 사용

WDF에는 프레임워크의 IFR( In-flight Recorder )이라고도 하는 내부 추적 로거가 포함되어 있습니다. WDF 로거는 각 WDF 드라이버에 대한 이벤트의 최근 기록을 포함하는 추적 로그를 만듭니다. 추적 로그는 프레임워크 및 드라이버를 통한 해당 요청을 통해 I/O 요청 패킷(IRP)의 진행률을 추적합니다. KMDF(드라이버 프레임워크) 및 User-Mode 드라이버 프레임워크(UMDF) 드라이버에 Kernel-Mode 고유한 로그가 있습니다.

WDF 로거는 항상 사용하도록 설정됩니다. 각 추적 로그에 대해 로거는 이벤트 레코드를 순환 메모리 버퍼에 저장합니다. 필요에 따라 세부 정보를 켜면 이벤트 로거가 내부 코드 경로로 들어오거나 나가는 항목과 같이 드라이버를 디버그하는 데 도움이 되는 추가 정보를 기록할 수 있습니다. 기본적으로 버퍼의 크기는 하나의 메모리 페이지이며 세부 정보는 꺼져 있습니다. WdfVerifier 애플리케이션 내에서 이러한 값을 조정하여 버퍼의 크기와 세부 정보를 변경할 수 있습니다. 세부 정보를 켜면 시스템 성능이 저하될 수 있습니다.

WDF 디버거 확장을 사용하여 대화형 디버깅 중에 WDF 로그를 보고 저장할 수 있습니다. 디버깅 세션 중에 WDF 로그를 보려면 다음을 수행합니다.

  1. 올바른 기호를 로드합니다. .symfix+ 디버거 명령을 사용하여 Microsoft 공용 기호 저장소를 기존 기호 경로에 추가할 수 있습니다. 공용 기호 저장소에는 WDF 이진 파일에 대한 기호가 포함됩니다. 드라이버 기호에 대한 기호를 로드할 수도 있습니다.

    창 기호를 가져오는 방법 및 디버거의 기호 경로를 설정하는 방법에 대한 자세한 내용은 Windows 디버깅 패키지와 함께 제공되는 설명서를 참조하세요.

  2. Wdfkd.dll 확장 라이브러리를 디버거에 로드합니다. 커널 디버거를 사용하는 경우 .load 명령을 사용하여 이 작업을 수행할 수 있습니다. 올바른 버전의 Wdfkd.dll 로드하려면 DLL에 대한 정규화된 경로를 지정해야 합니다. 예를 들어 x86 기반 디버거 호스트 머신에서 다음 경로를 사용합니다.

    .load "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext\wdfkd.dll"
    

    그런 다음 !chain 명령을 사용하여 로드된 모든 확장을 표시하여 확장이 로드되어 있는지 확인할 수 있습니다.

    프레임워크 디버거 확장에 대한 자세한 내용은 !wdfhelp 확장을 사용합니다. 커널 디버거에 대한 자세한 내용은 Windows 디버깅 패키지와 함께 제공되는 설명서를 참조하세요.

  3. 드라이버가 프레임워크 버전 1.11 이상을 사용하고 Windows 8 이상의 커널 디버거를 사용하는 경우 이 단계를 건너뛸 수 있습니다.

    드라이버가 1.11 이전의 프레임워크 버전을 사용하는 경우 !wdftmffile 또는 !wdfsearchpath 를 사용하여 플랫폼별 추적 메시지 형식(.tmf) 파일 또는 .tmf 파일 경로를 지정합니다. .tmf 파일은 WDK의 플랫폼별 하위 디렉터리에 있습니다.

    .tmf 파일은 버전별로 지정되므로 현재 실행 중인 프레임워크 런타임 라이브러리의 버전에 해당하는 .tmf 파일을 지정해야 합니다. 예를 들어 KMDF 버전 1.9가 호스트 머신에서 실행 중인 경우:

    !wdftmffile c:\WinDDK\<version>\tools\tracing\x86\wdf01009.tmf
    

    TRACE_FORMAT_SEARCH_PATH 환경 변수를 설정하여 검색 경로를 설정할 수도 있습니다. !wdftmffile 명령은 환경 변수에 의해 설정된 검색 경로보다 우선합니다.

    프레임워크 버전 번호를 확인하려면 커널 디버거에서 !wdfldr 디버거 확장 명령을 실행할 수 있습니다.

  4. !wdflogdump 확장을 사용하여 이벤트 로거의 레코드를 표시합니다. 예를 들어 WinDbg 명령 창의 다음 스크린샷은 !wdflogdump 출력의 일반적인 예를 보여줍니다.

    WinDbg 명령 창의 !wdflogdump 확장 출력 스크린샷

프레임워크 로그의 각 줄 앞에 는 추적 메시지 접두사라고 하는 문자열이 있습니다. 추적 로거는 로그에 기록되는 각 메시지에 이 접두사를 추가합니다. 기본적으로 접두사에는 표준 데이터 요소 집합이 포함되어 있지만 특정 요구 사항에 맞게 기본 요소를 변경할 수 있습니다. TRACE_FORMAT_PREFIX 환경 변수를 설정하거나 !wdfsettraceprefix 디버거 확장 명령을 사용하여 WDF 드라이버의 접두사 문자열을 변경할 수 있습니다.

환경 변수를 설정하려면 다음과 유사한 명령을 사용합니다.

Set TRACE_FORMAT_PREFIX=%2!s!: %!FUNC!: %8!04x!.%3!04x!: %4!s!:

이 명령은 추적 메시지 접두사를 다음으로 설정합니다.

SourceFile_LineNumber: FunctionName: ProcessID.ThreadID: SystemTime

!wdflogsave 확장 명령을 사용하여 TraceView를 사용하여 볼 수 있는 이벤트 추적 로그(.etl) 파일에 이벤트 로거의 레코드를 저장할 수도 있습니다.

경우에 따라 크래시 덤프에서 !wdfcrashdump 디버거 확장을 사용하여 시스템 버그 검사 후 로그 정보를 표시할 수 있습니다. 로그 정보는 프레임워크가 드라이버가 버그 검사 발생했는지 또는 드라이버에 대한 ForceLogsInMiniDump 레지스트리 값을 설정한 경우에만 크래시 덤프에서 사용할 수 있습니다.

버그 검사 발생할 때 디버거가 연결된 경우 !wdfcrashdump를 사용하여 로그 정보를 즉시 보거나 메모리 덤프 파일을 로드하여 정보를 볼 수 있습니다. 작은 메모리 덤프 파일의 크기 제한으로 인해 크래시가 발생한 드라이버에 대한 로그가 덤프에 표시되지 않을 수 있습니다.

프레임워크는 특정 드라이버가 다음 버그 검사 코드를 발생했는지 여부를 확인할 수 있습니다.

UMDF 버전 2부터 UMDF는 UMDF 추적 로그(또는 UMDF IFR)를 커널 비 페이징 메모리에 저장합니다. 프레임워크는 드라이버 호스트당 하나의 IFR(Wudfhost) instance 할당합니다.

디버거 확장 명령에 대한 자세한 내용은 프레임워크 기반 드라이버용 디버거 확장을 참조하세요.