标题中的 101
请参阅 wikipedia 101。
前言
我们在上一篇文章——本地内核调试环境搭建,就这么简单!中总结了本地内核调试的开启方法。本地内核调试有很多限制(比如,不能执行 .crash
来让系统蓝屏,不能执行 .dump
保存转储,不能下断点 ……),双机内核调试完全没有这方面的限制,可以说是真正意义上的内核调试。
双机内核调试主要分两种情况:
- 被调试系统运行在虚拟机中。
- 被调试系统运行在另外一台真实的物理机中。
不论被调试系统运行在虚拟机中,还是运行在另外一台物理机中,系统设置都是一样的。本文简单梳理了常用的内核调试设置方法及连接方法。
几种连接方式
可以通过 1394
,串口
(Pipe
),USB2.0
,USB3.0
,网络
等方式进行双机内核调试。我只使用过 串口
和 网络
在两台真实的物理机上进行双机内核调试,并没有使用过 1394
,USB2.0
,USB3.0
的方式。当被调试系统运行在虚拟机中的时候,我们可以使用 Pipe
和 VirtualKD
两种方式进行双机调试。
系统设置 & 连接方法
1. 网络
被调试系统设置:
1 | bcdedit /debug on |
温馨提示:
hostip
指的是调试主机端的ip
,不是当前系统的ip
!务必注意!很多朋友连不上,很可能是这里设置反了。- 端口号必须大于
49151
并且小于65536
。
调试主机连接方法:
1 | windbg.exe -k net:port=55555,key=your.own.safe.key |
2. 串口
被调试系统设置:
1 | bcdedit /debug on |
调试主机连接方法:
1 | windbg -k com:port=COM1,baud=115200 |
说明:
内核调试支持的波特率有
9600
、19200
、38400
、57600
和115200
几种。数值越大,传输速率越大。我们通常选最大的115200
。
关于波特率的介绍请参考百度百科:https://baike.baidu.com/item/%E6%B3%A2%E7%89%B9%E7%8E%87/2153185
3. 命名管道
当被调试的系统在虚拟机中时,我们可以通过命名管道模拟串口来进行双机内核调试。
被调试系统设置:(和串口一样)
1 | bcdedit /debug on |
调试主机连接方法:
1 | windbg -k com:pipe,port=\\VMHost\pipe\PipeName[,resets=0][,reconnect] |
简单介绍下相关参数:
com:
表示以串口形式连接。pipe
表示调试方式是通过命名管道模拟的串口。VMHost
表示虚拟机运行的机器名。因为命名管道可以跨机器。\\.
表示虚拟机运行在本地机器上。PipeName
表示命名管道的名字,不能与现有内核对象名字冲突。不一定非要是com1
之类的。reset
表示调试器向管道发送复位命令。调试器使用复位命令来与被调试系统建立连接。=0
表示无限发送。也可以指定一个其它的值,不过没必要。需要注意的是:对于VMWare
等不会丢弃过量数据的虚拟机,不要指定此参数。真正的物理端口会自动丢弃过剩的数据包,Virtual PC
也会自动丢弃。reconnect
参数表示如果读写管道失败,调试器会自动重新连接。如果不指定reconnect
选项,那么每次虚拟机重新启动时,需要重新启动调试器,否则无法建立连接。指定此参数后,虚拟机可以任意重启,调试器会自动连接。
4. 其它连接方式
1394
:我机器上没有1394
端口,所以没有实际尝试过。usb2.0
:要求使用 0 号端口。而且对数据线也有要求:一般的usb2.0
的数据线不行,因为需要同时连接两台物理机。没尝试过。usb3.0
:需要买专用的线,或者制作特殊的线,之前工作电脑上还没有usb3.0
的接口,所以也没尝试过。强烈推荐大家参考张银奎老师的文章:http://advdbg.org/blogs/advdbg_system/articles/5954.aspx。看的我手又痒痒了。:)eXDI
:请参考张银奎老师的文章:http://advdbg.org/blogs/advdbg_system/articles/903.aspx。
因为以上几种形式我没实战过,就不搬文档了。而且,设置起来不算复杂。如果有需要,请参考官方文档 https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/setting-up-kernel-mode-debugging-in-windbg--cdb--or-ntsd。
检查
做好设置后,在开始搭建物理环境前,我们需要确保设置正确。我们可以执行 bcdedit /enum {ID}
来检查对应启动项是否开启了 Debug
,并且执行 bcdedit /dbgsettings
来检查当前设置的参数是正确的。下图是我设置内核调试方式为网络的截图:
物理环境搭建
1. 被调试系统运行在真实的物理机中。
我通过 网络
和 串口
两种方式成功的进行过双机内核调试。
网络
:不需要做特殊设置。但是需要注意以下几点:- 需要检查网卡是否支持内核调试,不是所有网卡都支持双机内核调试的。具体支持的网卡列表请参考微软官方文档:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/supported-ethernet-nics-for-network-kernel-debugging-in-windows-10。
- 要使用网线,不要使用无线网卡。
- 被调试系统必须是
win8
及以后的操作系统,运行调试器的系统至少是win7
系统。
串口
:需要制作特殊的线,一般的串口线不行。当时买了一根,找了同学帮忙焊了下,成功的连上了。串口线连接方法,请参考 https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/setting-up-a-null-modem-cable-connection。
2. 被调试系统运行在虚拟机中。
我通过 Pipe
和 VirtualKD
两种方式成功的进行过双机内核调试。
使用虚拟串口,传输速率是真的慢。使用 VirtualKD
,相较于虚拟串口,速度要快很多。调试运行在虚拟机中的系统应该是比较常见的形式,毕竟不需要两台物理机,在本地装个虚拟机就够了。具体的环境搭建方法请参考下一篇文章。
总结
bcdedit
是内核调试设置的好帮手,建议大家好好了解下。使用串口做双机内核调试,传输速率是真的慢,建议大家尽量用其它方式。
通过网络进行双机内核调试时,
hostip
指的是运行内核调试器系统的ip
,而不是被调试系统的ip
。强烈建议大家参考《软件调试》第 18 章。介绍的非常详细,有各种连接方式的介绍,也有原理讲解。
参考资料
- 《软件调试》第 18 章
- https://docs.microsoft.com/en-us/windows-hardware/drivers/devtest/boot-parameters-to-enable-debugging
- Setting Up Kernel-Mode Debugging over a Serial Cable Manually
- Setting Up Kernel-Mode Debugging over a USB 3.0 Cable Manually
- Setting Up Kernel-Mode Debugging over a USB 2.0 Cable Manually
- Setting Up Kernel-Mode Debugging over a 1394 Cable Manually
- Setting Up KDNET Network Kernel Debugging Manually
- https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/attaching-to-a-virtual-machine--kernel-mode-
- https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/supported-ethernet-nics-for-network-kernel-debugging-in-windows-10