다음을 통해 공유


비디오: WDF 소스 코드를 사용하여 드라이버 디버깅

이 항목에는 WDF 소스 코드에 대한 모든 권한이 있는 WDF(Windows 드라이버 프레임워크) 드라이버를 디버그하는 방법을 보여 주는 비디오 자습서가 포함되어 있습니다. 비디오 다음에는 편리한 참조를 위해 비디오에 이어지는 단계별 프로시저가 있습니다.

WDF 소스 디버깅을 사용하면 WDF 소스 코드를 다운로드할 필요 없이 프레임워크 코드로 자유롭게 단계별로 실행할 수 있습니다. 디버거는 GitHub에서 올바른 버전의 WDF를 자동으로 다운로드합니다.

예를 들어 WinDbg를 사용하여 Windows 10 컴퓨터에서 WDF 드라이버를 디버그하고 호출 스택의 프레임워크 코드로 디버거가 손상된 경우 호출 스택 보기에서 WDF 프레임을 두 번 클릭하면 WinDbg에서 자동으로 일치하는 줄에서 관련 WDF 원본 파일을 다운로드하고 엽니다. 그런 다음 코드를 단계별로 실행하고 중단점을 설정할 수 있습니다.

이 기능은 Windows 10, Technical Preview 빌드 10041 이상의 공개 릴리스를 실행하는 대상 시스템에 사용할 수 있습니다. 이러한 빌드에는 Microsoft 공용 기호 서버에서 사용할 수 있는 KMDF(Wdf01000.sys) 및 UMDF(Wudfx02000.dll)에 대한 프라이빗 원본 인덱싱 기호 파일이 있습니다. WDF 코드의 원본 수준 디버깅은 Visual Studio 디버거가 아닌 WinDbg에서만 사용할 수 있습니다.

빠른 시작

대상 머신에 대한 WinDbg 커널 디버그 세션을 시작하고 중단한 후 다음 단계를 수행합니다.

  1. .symfix를 사용하여 기본 기호 경로를 설정합니다. 그러면 에서 기호 서버를 https://msdl.microsoft.com/download/symbols가리키도록 기호 경로가 설정됩니다.

    kd> .symfix

  2. .srcfix를 사용하여 기본 원본 경로를 설정합니다. 이렇게 하면 원본 경로가 srv*로 설정되며, 이 경로는 디버거에게 대상 모듈의 기호 파일에 지정된 위치에서 원본 파일을 검색하도록 지시합니다.

    kd> .srcfix
    Source search path is: SRV*
    
  3. .reload를 사용하여 기호를 다시 로드하고 Wdf01000.sys 기호(또는 UMDF의 경우 Wudfx02000.dll)가 소스 인덱싱되어 있는지 확인합니다. 아래 !lmi의 출력에 표시된 것처럼 Wdf01000.sys PDB는 원본 인덱싱됩니다. 그렇지 않은 경우 아래의 WinDbg 설치 섹션을 참조하세요.

    kd> .reload
    ...
    
    kd> !lmi wdf01000.sys
    Loaded Module Info: [wdf01000.sys] 
    ...
    Load Report: private symbols & lines, source indexed 
    C:\...\Wdf01000.pdb\...\Wdf01000.pdb
    
  4. 이제 모든 설정을 완료했습니다. WDF 소스 코드를 단계별로 수행하는 쉬운 방법은 프레임워크의 IRP 디스패치 루틴에서 중단점을 설정한 다음 나머지 코드를 단계별로 진행하는 것입니다. Windows 시스템에는 많은 받은 편지함 KMDF 드라이버가 있으므로 WDF는 항상 로드되고 실행되므로 이 중단점은 즉시 적중됩니다(사용자 고유의 드라이버를 로드할 필요 없이).

    kd> bp Wdf01000!FxDevice::DispatchWithLock
    kd> g
    Breakpoint 0 hit
    Wdf01000!FxDevice::DispatchWithLock:
    87131670 8bff mov edi,edi 
    

이 작업이 작동하지 않으면 아래 WinDbg 설치 단계를 검사.

WinDbg 설정

위의 예제가 예상대로 작동하지 않는 경우 아래 지침 중 하나 이상을 수행해야 할 수 있습니다.

소스 모드 디버깅 사용

소스 모드에서 디버깅이 사용하도록 설정되어 있는지 확인합니다. 디버그 메뉴를 열고 소스 모드가 선택되어 있는지 확인합니다.

부실 기호 캐시 지우기

이전에 동일한 Windows 대상에 대해 WDF 드라이버를 디버깅한 경우 원본 인덱싱되지 않은 로컬로 캐시된 WDF 기호를 사용하고 있을 수 있습니다. !lmi 명령을 사용하여 이를 검사 수 있습니다.

kd> !lmi Wdf01000.sys
Loaded Module Info: [wdf01000.sys]
...
Load Report: private symbols & lines, not source indexed
C:\...\Wdf01000.pdb\...\Wdf01000.pdb

위의 부하 보고서에 따르면 Wdf01000.pdb는 원본 인덱싱되지 않습니다. 즉, 로컬 WinDbg 기호 캐시가 부실합니다. 이 문제를 해결하려면 WinDbg에서 PDB를 언로드하고 로컬 캐시를 지우고(위의 !lmi 출력에 따라 경로가 다를 수 있음) PDB를 다시 로드합니다.

kd> .reload /u Wdf01000.sys

CMD> del
C:\...\Wdf01000.pdb\...\Wdf01000.pdb

kd> .reload Wdf01000.sys

이제 !lmi를 실행하여 다시 검사: PDB가 소스 인덱싱된 것으로 표시되고 소스 코드 창이 팝업됩니다.

kd> !lmi Wdf01000.sys
Loaded Module Info: [wdf01000.sys]
...
Load Report: private symbols & lines, source indexed
C:\...\Wdf01000.pdb\...\Wdf01000.pdb 

WDF 원본 수준 디버깅은 실시간 디버깅 및 크래시 덤프 분석뿐만 아니라 IRP 디스패처와 같은 핵심 함수에 중단점을 설정하고 후속 코드 경로를 탐색하여 프레임워크 내부에 대해 자세히 배울 수도 있습니다.