当我们搭建好驱动开发环境后,就可以设置双机调试了,虚拟机的安装可以参考网上其他教程,比较简单,我们直接来讲设置双击调试需要注意的一些地方。
1.设置被调试的虚拟机
首先,将虚拟机关机,如果此时已经有了串行端口存在首先移除,管道名字输入 \\.\pipe\com_1,并选择“该端是服务器”、“另一端是应用程序”:
然后 win + R 打开命令行,输入 msconfig ,做如下设置先不重启:
2.设置 windbg 的快捷连接方式
由于我们之前安装 SDK 和 WDK 的时候,会默认给我们安装 windbg 经典版,若没有安装的话,也可以自己去网上找 windbg 的安装包安装一下即可,我的 windbg 安装路径是 F:\Windows Kits\10\Debuggers\x64\windbg.exe,我们需要给 windbg 提供启动参数,让它能够应该和哪个管道进行连接。我们为 windbg 创建一个快捷方式,并右键快捷方式选择属性,在快捷方式选项卡下将目标
设置为:
"F:\\Windows Kits\\10\\Debuggers\\x64\windbg.exe" -b -k com:pipe,port=\\\\.\\pipe\\com_1,resets=0,reconnect -y
设置完成后,我们就可以直接通过点击这个快捷方式连接到虚拟机。
3.禁用驱动签名、打开测试模式和复制 Boot 菜单
最后我们需要禁用驱动签名、打开系统测试模式和复制 Boot 菜单并重启。由于在开发的过程中,我们测试自己写好的驱动是没有进行签名的,无法在正常的系统上运行,所以我们需要禁用驱动签名和打开系统的测试模式,复制 Boot 菜单是为了在每次系统启动的时候我们可以选择进入正常的系统或者进入我们配置好的调试系统,只需要在虚拟机上运行以下批处理命令即可:
bcdedit /set nointegritychecks on
bcdedit /set testsigning on
bcdedit /copy {current} /d "win10 x64 debug for windbg"
shutdown -s -t 1000
不禁用驱动签名在加载驱动的时候就会出现如下情况:
然后在系统重启的时候,我们选择我们复制出来的引导项,也就是第二个,然后再次重启进入系统的时候,我们点击创建的 windbg 快捷方式进行连接。
4.设置符号表和调试信息输出
在 windbg 已经成功连接被调试机的时候,可以打开主菜单 File,然后选择 Symbol File Path 来设置符号表的位置,设置如下:
srv*D:\symbs*http://msdl.microsoft.com/download/symbols;D:\work\myp
roject\build\output\x64\Debug
这个设置的前半部分从微软的网址下载符号表,并保存到 D:\symbs 目录下。而后半部分是工程的调试版本的编译输出目录,可以按照自己的真实路径来调整。
一般来说,在调试的时候,只要你按下了 Ctrl 加 Break 键中断了被调试机,然后输入如下命令:
.reload
回车后,符号表就会开始加载或者下载。符号表无法下载的时候,必须把 Symbal path 设置中关于微软的部分全部删除。否则每次调试的时候都会尝试从微软下载符号表,每次都会卡很长时间。当然我们尽量要下载符号表,在调试内核的时候会给我们很大的帮助,比如没有下载符号表则无法使用 dt 命令来查询 EPROCESS 这个内核结构体。
此时,在我们调试的时候,可能会发现,当我们在驱动程序中编写了打印调试信息的语句,但是 windbg 却不显示调试信息,原因是因为我们没有设置合适的调试信息输出等级,我们只要在 windbg 命令行中输入以下命令运行即可:
//不区分大小写,用于打开Windows驱动或者内核调试筛选器
ed kd_default_mask 0xffffffff
5.设置 windbg 的工作窗口
我们可以根据自己的习惯设置 windbg 的工作窗口,在菜单栏中 View 中开启相应的窗口并调整位置,并在 File 中保存工作区,如下:
6.做好快照
最后,我们必须要对设置好的调试环境做一个快照,因为 windows 每次启动非常耗时。但更要命的是每次启动之后,Windows 的内存布局是不同的。通过快照,一方面我们每次可以直接恢复快照进行迅速连接,另一方面当我们的调试系统出现环境异常或者崩溃的时候,我们也可以恢复最初始的环境,毕竟在调试内核的过程中,蓝屏是家常便饭。
不过值得一提的是,这里有两个地方需要注意:
- 在我们每次进行快照之前,我们先中断调试系统,然后再进行快照,下次恢复快照的时候,使用 windbg 快捷方式就可以直接连接上(否则大概率会出现无法直接连上的情况,我估计是因为当我们中断调试系统的时候,会对系统环境进行保存,而若在没有中断系统的情况下进行保存,下次再恢复快照的时候无法直接连上,需要每次点 windbg 的 “Break”(中断) 命令才行)。
- 每当我们的 windbg 连接不上时,而被调试的系统也在正常运行着,这时候点一下 WinDbg 的“Break”(中断)命令一般就能够连接上了。