双机内核调试 101

Posted bianchengnan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双机内核调试 101相关的知识,希望对你有一定的参考价值。

标题中的 101 请参阅 wikipedia 101

前言

我们在上一篇文章——本地内核调试环境搭建,就这么简单!中总结了本地内核调试的开启方法。本地内核调试有很多限制(比如,不能执行 .crash 来让系统蓝屏,不能执行 .dump 保存转储,不能下断点 ……),双机内核调试完全没有这方面的限制,可以说是真正意义上的内核调试。

双机内核调试主要分两种情况:

  1. 被调试系统运行在虚拟机中。
  2. 被调试系统运行在另外一台真实的物理机中。

不论被调试系统运行在虚拟机中,还是运行在另外一台物理机中,系统设置都是一样的。本文简单梳理了常用的内核调试设置方法及连接方法。

几种连接方式

可以通过 1394串口Pipe),USB2.0USB3.0网络 等方式进行双机内核调试。我只使用过 串口网络 在两台真实的物理机上进行双机内核调试,并没有使用过 1394USB2.0USB3.0 的方式。当被调试系统运行在虚拟机中的时候,我们可以使用 PipeVirtualKD 两种方式进行双机调试。

系统设置 & 连接方法

1. 网络

被调试系统设置:

bcdedit /debug on
bcdedit /dbgsettings net hostip:192.168.1.2 port:55555 key:your.own.safe.key

温馨提示:

  • hostip 指的是调试主机端ip,不是当前系统的 ip !务必注意!很多朋友连不上,很可能是这里设置反了。
  • 端口号必须大于 49151 并且小于 65536

调试主机连接方法:

windbg.exe -k net:port=55555,key=your.own.safe.key

技术图片
windbg 设置界面

2. 串口

被调试系统设置:

bcdedit /debug on
bcdedit /dbgsettings serial debugport:1 baudrate:115200

调试主机连接方法:

windbg -k com:port=COM1,baud=115200

技术图片
windbg 界面设置

说明:

内核调试支持的波特率有 9600192003840057600115200 几种。数值越大,传输速率越大。我们通常选最大的 115200
关于波特率的介绍请参考百度百科:https://baike.baidu.com/item/波特率/2153185

3. 命名管道

当被调试的系统在虚拟机中时,我们可以通过命名管道模拟串口来进行双机内核调试。

被调试系统设置:(和串口一样)

bcdedit /debug on
bcdedit /dbgsettings serial debugport:1 baudrate:115200

调试主机连接方法:

windbg -k com:pipe,port=VMHostpipePipeName[,resets=0][,reconnect]

技术图片
windbg 界面设置

简单介绍下相关参数:

  • com: 表示以串口形式连接。
  • pipe 表示调试方式是通过命名管道模拟的串口。
  • VMHost 表示虚拟机运行的机器名。因为命名管道可以跨机器。. 表示虚拟机运行在本地机器上。
  • PipeName 表示命名管道的名字,不能与现有内核对象名字冲突。不一定非要是 com1 之类的。
  • reset 表示调试器向管道发送复位命令。调试器使用复位命令来与被调试系统建立连接。
  • =0 表示无限发送。也可以指定一个其它的值,不过没必要。需要注意的是:对于 VMWare 等不会丢弃过量数据的虚拟机,不要指定此参数。真正的物理端口会自动丢弃过剩的数据包,Virtual PC 也会自动丢弃。
  • reconnect 参数表示如果读写管道失败,调试器会自动重新连接。如果不指定 reconnect 选项,那么每次虚拟机重新启动时,需要重新启动调试器,否则无法建立连接。指定此参数后,虚拟机可以任意重启,调试器会自动连接。

4. 其它连接方式

因为以上几种形式我没实战过,就不搬文档了。而且,设置起来不算复杂。如果有需要,请参考官方文档 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. 被调试系统运行在真实的物理机中。

我通过 网络串口 两种方式成功的进行过双机内核调试。

2. 被调试系统运行在虚拟机中。

我通过 PipeVirtualKD 两种方式成功的进行过双机内核调试。

使用虚拟串口,传输速率是真的慢。使用 VirtualKD,相较于虚拟串口,速度要快很多。调试运行在虚拟机中的系统应该是比较常见的形式,毕竟不需要两台物理机,在本地装个虚拟机就够了。具体的环境搭建方法请参考下一篇文章。

总结

  • bcdedit 是内核调试设置的好帮手,建议大家好好了解下。

  • 使用串口做双机内核调试,传输速率是真的慢,建议大家尽量用其它方式。

  • 通过网络进行双机内核调试时,hostip 指的是运行内核调试器系统的 ip,而不是被调试系统的 ip

  • 强烈建议大家参考《软件调试》第 18 章。介绍的非常详细,有各种连接方式的介绍,也有原理讲解。

参考资料

以上是关于双机内核调试 101的主要内容,如果未能解决你的问题,请参考以下文章

[原]通过网线进行双机内核调试

Macos双机调试内核(Parallels desktop)

linux双机调试

ubuntu18.04下双机驱动调试

Windbg调试内核shellcode

通过并口进行 windbg 双击 Kernel 调试