You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 状态为 Yes
    • testsigning 状态为 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 19:07:27