本主题包含一个视频教程,演示如何使用对 WDF 源代码的完全访问权限调试 Windows 驱动程序框架(WDF) 驱动程序。 视频后面是视频中提到的分步骤过程,便于参考。
WDF 源调试允许你自由地单步执行框架代码,而无需下载 WDF 源代码。 调试器会自动从 GitHub 下载正确的 WDF 版本。
例如,如果使用 WinDbg 在 Windows 10 计算机上调试 WDF 驱动程序,并且调试器与调用堆栈中的框架代码中断,则可以双击调用堆栈视图中的 WDF 帧,WinDbg 会自动下载并在匹配行中打开相关的 WDF 源文件。 然后,可以单步执行代码并设置断点。
此功能适用于运行 Windows 10、Technical Preview 内部版本 10041 或更高版本公共版本的目标系统。 这些内部版本具有在 Microsoft 公共符号服务器上提供的 KMDF(Wdf01000.sys)和 UMDF(Wudfx02000.dll)的专用源索引符号文件。 WDF 代码的源级调试仅在 WinDbg 中可用,在 Visual Studio 调试器中不可用。
快速入门
启动目标计算机的 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 源代码的一种简单方法是在 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 调度程序等核心函数上设置断点以及浏览后续代码路径,来深入了解框架内部。