이 항목에는 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 커널 디버그 세션을 시작하고 중단한 후 다음 단계를 수행합니다.
.symfix를 사용하여 기본 기호 경로를 설정합니다. 그러면 기호 경로가 기호 서버를 https://msdl.microsoft.com/download/symbols가리키도록 설정합니다.
kd> .symfix
.srcfix를 사용하여 기본 원본 경로를 설정합니다. 그러면 원본 경로가 srv*로 설정되며, 이 경로는 대상 모듈의 기호 파일에 지정된 위치에서 소스 파일을 검색하도록 디버거에 지시합니다.
kd> .srcfix Source search path is: SRV*
.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
이제 모든 설정을 완료했습니다. 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 디스패처와 같은 핵심 함수에 중단점을 설정하고 후속 코드 경로를 탐색하여 프레임워크 내부를 자세히 학습하는 데에도 사용할 수 있습니다.