前言
内核调试默认是关闭的,需要手动开启。本文将简单介绍如何在 Vista
及后续版本的系统中开启本地内核调试,并简要介绍使用 windbg
连接内核的方法。在 xp
系统中,对应的设置保存在 boot.ini
中,感兴趣的小伙伴儿请自行搜索设置方法。
本地内核调试
windbg
不仅可以作为用户态调试器使用,还可以作为内核调试器使用。相较于命令行版本的 kd.exe
,windbg
更友好。在 windbg
中,通过菜单 File
-> Kernel Debug (Ctrl + K)
可以打开内核调试设置界面,如下图:
NET
,USB
,1394
,COM
这四个选项是针对双机内核调试的,本文不涉及。Local
是本地内核调试用的,我们发现不用进行任何设置。点击 确定
按钮即可进行本地内核调试。
如果觉得上述操作太繁琐,我们可以以管理员权限运行 windbg.exe -kl
直接开启本地内核调试。
可能遇到的问题
我们可能遇到下面的错误提示:
Local kernel debugging requires Administrative
privileges, and is not supported by WOW64.
Only a single local kernel debugging session can run at a time.
Local kernel debugging is disabled by default. You must run 'bcdedit -debug on' and reboot to enable it.
具体错误提示如下图:
根据错误提示,我们可以知道进行本地内核调试需要注意以下几点:
- 本地内核调试需要管理员权限。
- 不支持
WOW64
。如果是64
位系统,必须使用64
位的windbg
。 - 同一时间只能建立一个本地内核调试会话。
- 本地内核调试默认是关闭的。需要通过
bcdedit /debug on
开启,重启生效。
通过命令行开启
按照提示,以管理员权限执行 bcdedit /debug on
。重启系统后,以管理员权限运行 windbg -kl
进行本地内核调试。如果顺利,我们就可以进行本地内核调试了。
通过界面开启
我们也可以通过 msconfig
打开系统配置,在 引导高级选项
对话框中开启本地内核调试。具体设置过程请参考下图。
关闭安全启动
以管理员权限执行 bcdedit /debug on
,如果顺利,会有操作成功的提示,如下图。
在某些机器的 win10
系统中,可能会遇到如下的提示。
正如 微软官方文档 里介绍的那样:
Before using bcdedit to change boot information you may need to temporarily suspend Windows security features such as BitLocker and Secure Boot on the test PC. You can re-enable Secure Boot once you’re done debugging and you’ve disabled kernel debugging on the local computer.
在使用 bcdedit
更改启动信息之前,我们可能需要暂时关闭 Windows
的安全特性,比如 BitLocker
和安全启动。
我电脑上的安全启动选项是启用的,如下图:
在 BIOS
里禁用安全启动后,重新执行 bcdedit /debug on
即可成功开启本地内核调试。
bcdedit 用法简介
可以直接运行 bcdedit /?
查看帮助,通过 bcdedit /? command
查看每个命令的用法。
其实, bcdedit /debug on
的完整版是 bcdedit /debug [{ID}] { on | off }
,如果省略 {ID}
,默认取 {current}
。如果想为其它系统设置,可以指定对应启动项的标识符。
-
执行
bcdedit /enum [{ID}]
可以列出指定ID
对应的启动项, 如不指定ID
可以列出所有的启动项。 -
执行
bcdedit /copy {ID} /d "description"
可以把当前的启动项复制一份。 -
执行
bcdedit /delete {ID}
可以删除指定ID
对应的启动项。
本地内核调试的限制
在进行本地内核调试的时候,下面这些命令是不能执行的:
- 执行命令,比如
g (Go)
,p (Step)
,t (Trace)
,wt (Trace and Watch Data)
,tb (Trace to Next Branch)
,gh (Go with Exception Handled)
,gn (Go with Exception Not Handled)
。 - 关机和转储命令。比如,
.crash
,.dump
,.reboot
等。 - 断点命令。比如,
b
系列命令。bp
,bu
,ba
,bc
,bd
,be
,bl
等。 - 寄存器显示命令。比如
r
系列命令。 - 栈命令。比如,
k
系列命令。
小知识
不知道大家平时是怎么截图的。是否用过键盘上的 PrtSc
键(一般在 F12
右侧)截图呢?也许有的小伙伴会问,截图键跟内核调试有什么关系?其实,在很多键盘上,PrtSc
和 SysRq
是同一个键。
当我们开启本地内核调试后,如果我们按 SysRq
键,系统会挂起。具体可以参考张老师的回帖。http://advdbg.org/forums/6537/ShowPost.aspx#6537。前几天访问高端调试论坛,发现挂了,今日终于能访问了,赶紧截图保存一份。
SysRq
在 Linux
下也有类似的作用,可以参考网址 https://www.ibm.com/developerworks/cn/linux/l-cn-sysrq/。
温馨提示:
一定要记住这个小知识。我被这个“虐”了很久。当年在公司机器上开启内核调试后,不知道这回事。在开发过程中需要截图,一按
PrtSc
系统就挂起,一按PrtSc
系统就挂起。害我重启了 N 次。说多了都是泪。
总结
-
bcdedit /debug on|off
可以开启(关闭)本地内核调试。 -
如果开启本地内核调试失败,提示
该值受安全引导策略保护,无法进行修改或删除
,可以在BIOS
中关闭安全引导。 -
运行
kd.exe -kl
或者windbg.exe -kl
可以进行本地内核调试。 -
本地内核调试需要管理员权限,如果遇到错误,请先检查权限。
-
bcdedit
的用法大家需要熟悉,在配置双机内核调试的时候还会用到。
本以为在本地内核调试的时候,可以很方便的保存一份转储文件,没想到居然不支持!如果有哪位小伙伴儿知道如何在本地内核调试的时候比较方便的保存一份系统转储文件,烦请告知。