使用 KD 调试用户模式故障
若要正确调试用户模式故障,需要 CDB 或 WinDbg。 但是,有时用户模式异常会中断 KD,因为不存在用户模式调试器。 有时,在调试内核模式问题时,监视特定用户模式进程正在执行的操作也很有帮助。
默认情况下,内核调试器尝试加载与 k、 u 或 ln 命令 (指定地址匹配的第一个用户模式符号) 。
遗憾的是,用户模式符号通常未在符号路径中指定,或者第一个符号不是正确的符号。 如果符号不存在,请将它们复制到符号路径,或使用 .sympath (设置符号路径) 命令指向完整的符号树,然后使用 .reload (Reload Module) 命令。 如果加载了错误的符号,可以通过执行 .reload <binary.ext> 来显式加载符号。
大多数 Windows DLL 已重定基,因此它们在不同的地址加载,但也有例外。 视频适配器是最常见的异常。 有数十个视频适配器都在同一基址加载,因此 KD 几乎总是会找到 ati.dll (第一个视频符号,按字母顺序) 。 对于视频,还加载了一个 .sys 文件,可以使用 lm 命令进行标识。 有了这些信息,你可以发出 .reload 来获取正确的视频 DLL。 有时调试器也会变得混乱,重新加载特定符号将有助于提供正确的堆栈。 取消组合函数以查看符号是否正确。
与视频 DLL 类似,几乎所有可执行文件都在同一地址加载,因此 KD 将报告访问权限。 如果在访问中看到堆栈跟踪,请执行 !进程 ,然后执行给定的可执行文件名称的 .reload 。 如果可执行文件在符号路径中没有符号,请将其复制到该处,然后再次执行 .reload 。
有时,即使完整的符号树位于符号路径中,KD 或 WinDbg 也难以加载正确的用户模式符号。 在这种情况下,ntdll.dll 和 kernel32.dll 是所需的两个最常见的符号。 从 KD 调试 CSRSS 时,winsrv.dll 和 csrsrv.dll 也是要加载的常见 DLL。