Windows 11 ARM64平台KMD远程调试无法触发断点求助
ARM64内核驱动无法触发断点的排查方案
问题背景
在Windows 10 x64的Visual Studio中编译默认ARM64内核模式驱动(KMD),用于远程调试。已完成以下操作:
- 以测试签名模式编译驱动
- 完成Windows 11 ARM64目标系统预配置
- 可通过串行链路运行内核态WinDbg
- 可通过TCP/IP在Visual Studio中激活部署与调试器
驱动远程部署后在设备管理器可见,但DriverEntry()及所有事件断点均无法触发,尝试过Visual Studio设断点、WinDbg设断点、硬编码DbgBreakPoint()均无效,目标设备已通过BCDEdit开启Debug和Test signing标志。
排查步骤
1. 确认驱动实际加载与执行状态
- 在WinDbg中执行命令
!drvobj <你的驱动名称> 2,检查驱动对象是否存在,同时确认DriverEntry函数是否被调用过 - 执行
lm m <驱动文件名>,查看驱动加载基址,确认是否有对应符号加载(符号未加载时断点无法生效)
2. 符号配置与加载验证
- 确保调试器(VS/WinDbg)的符号路径包含本地驱动PDB文件路径,以及微软公共符号服务器,示例符号路径配置:
srv*C:\Symbols*https://msdl.microsoft.com/download/symbols - 执行
.reload /f <驱动文件名>.sys强制重新加载符号,再用x <驱动模块名>!DriverEntry检查是否能解析到函数地址,若能输出地址则符号加载正常
3. 断点触发时机调整
- DriverEntry在驱动加载阶段执行,若部署后驱动已完成加载,断点不会触发:
- 在Visual Studio的调试部署设置中,开启部署后自动重启目标设备,确保断点在DriverEntry执行前被注册
- 在WinDbg中使用
bu <驱动模块名>!DriverEntry设置未解析断点(bu用于在驱动未加载前预注册断点,驱动加载时自动命中)
4. 调试连接状态确认
- 确认WinDbg/Visual Studio与目标设备的连接为内核态调试会话,而非用户态
- 在WinDbg中执行
!debugger,查看当前调试器连接状态,确认已成功进入内核调试模式
5. 系统调试配置复查
- 执行
bcdedit /enum {current},验证以下关键配置:debug状态为Yestestsigning状态为Yes- 可选:
nointegritychecks设为Yes,避免完整性校验干扰驱动加载 - 确认调试端口(串行/TCP/IP)配置正确,无端口冲突
6. 硬编码断点兼容性调整
- ARM64架构下,替换
DbgBreakPoint()为__debugbreak()内联断点指令,重新编译驱动后部署测试 - 或使用
KeBugCheckEx(0xDEADBEEF, 0, 0, 0, 0)强制触发蓝屏,验证驱动代码是否执行到该位置
7. 驱动签名与加载权限验证
- 运行
sigverif工具,检查目标设备上的驱动签名是否为有效测试签名 - 检查目标设备注册表项
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management下,DisableDriverSignature Enforcement值是否设为1(Windows 11部分版本需额外配置该项)
内容的提问来源于stack exchange,提问作者Guy Winslow
相关产品推荐
相关产品推荐

