上一篇
物理机双机调试设置
- 物理机
- 2025-07-26
- 3
机双机调试需配置相同网络段IP,启用心跳检测与仲裁机制,同步时钟源,交叉连接业务端口并
Windows系统下的网络调试方案(基于Windbg)
-
准备工作
- Host端操作:下载并安装Windows SDK以获取Windbg工具;将指定文件(
Debuggersx64kdnet.exe
和VerifiedNICList.xml
)从Windbg安装目录复制到Target端。 - 网络要求:若Target为物理机,则需确保与Host处于同一局域网;若为虚拟机,应采用桥接模式并关闭两台设备的Secure Boot(在BIOS中设置)。
- Host端操作:下载并安装Windows SDK以获取Windbg工具;将指定文件(
-
Target端配置
- 以管理员身份启动命令提示符,执行命令:
kdnet.exe ${Host IP} ${Port}
,其中${Host IP}
替换为Host的实际IP地址,端口号通常选择范围50000~50039(其他值也可行但建议优先使用该区间),执行后会返回类似如下格式的结果:windbg -k net:port=50015,key=XXXXXXXXXXXXXXXX
。 - 开放防火墙规则:进入控制面板 → “系统和安全” → Windows Defender防火墙 → 高级设置 → 入站规则,启用“File and Printer Sharing (ICMPv4-In)”。
- 以管理员身份启动命令提示符,执行命令:
-
Host端连接调试
- 打开Windbg或其预览版,依次点击菜单栏的
File → Start debugging → Attach to kernel → Net
,填入Target端生成的端口号(如50015)及对应的密钥(即上述结果中的key
值),确认后即可启动调试,此时重启Target机器便能正常进行调试交互。
- 打开Windbg或其预览版,依次点击菜单栏的
Linux内核双机调试方案(串口通信)
-
硬件准备与测试
- 需要两根物理机、一套串口转USB线缆以及Linux源码,将串口端接入Target机的ttyS1接口,USB端连接至Host机的对应接口,双方安装Cutecom软件验证通信功能:在Host端打开设备
/dev/ttyUSB0
,Target端打开/dev/ttyS1
,通过互发数据确认连接正常。
- 需要两根物理机、一套串口转USB线缆以及Linux源码,将串口端接入Target机的ttyS1接口,USB端连接至Host机的对应接口,双方安装Cutecom软件验证通信功能:在Host端打开设备
-
Target端编译与启动设置
- 编译内核时需勾选以下选项:
KGDB
,KGDB_SERIAL
,KGDB_USB
,DEBUG_INFO
,DEBUG_INFO_DWARF4
,MAGIC_SYSRQ
,修改/etc/default/grub
文件中的GRUB_CMDLINE_LINUX参数,添加nokaslr
以固定内核加载地址,随后执行sudo update-grub
更新配置并重启系统。
- 编译内核时需勾选以下选项:
-
Host端代理与调试流程
- 克隆并编译Agent-Proxy工具:运行
git clone http://git.kernel.org/pub/scm/utils/kernel/kgdb/agent-proxy.git
后进入目录执行make
,再以root权限启动:sudo ./agent-proxy 5550^5551 0 /dev/ttyUSB0,115200
,其中端口5550用于控制台输出,5551作为KGDB监听端口。 - 建立连接:在Host端通过
sudo telnet localhost 5550
访问Target的控制台;输入命令echo g >/proc/sysrq-trigger
暂停Target系统,使其进入等待远程GDB连接的状态,然后在Host端启动GDB并加载符号表:gdb vmlinux
(需提前将Target生成的vmlinux拷贝至Host),接着输入target remote localhost:5551
完成远程绑定,对于模块化代码(如KVM驱动),还需手动加载符号文件:使用add-symbol-file arch/x86/kvm/kvm.ko [内存地址]
指定模块基址。
- 克隆并编译Agent-Proxy工具:运行
通用注意事项与扩展场景
-
传输速率优化:相较于传统串口,VirtualKD工具可显著提升数据传输效率,尤其适用于虚拟机环境,其原理是基于内核调试引擎的扩展DLL功能,通过管道模拟高速通信通道。
-
网络调试限制:并非所有网卡均支持内核级网络调试,具体兼容列表可参考微软官方文档,目标系统必须为Win8及以上版本才能启用相关功能。
-
故障排查技巧:若遇到连接失败问题,建议优先检查BIOS中的安全启动选项是否已禁用;同时验证两端IP地址、端口号及密钥是否完全匹配,对于Linux系统,可通过
dmesg
查看是否成功注册I/O驱动kgdboc
来快速定位问题点。
调试类型 | 连接方式 | 适用场景 | 优势与劣势对比 |
---|---|---|---|
Windows网络调试 | 网线直连/同一局域网 | 用户态程序、驱动开发 | 配置简单但依赖特定端口范围;受防火墙影响较大 |
Linux串口调试 | USB转串口线缆 | 内核协议栈、早期启动流程分析 | 稳定性高但速率较低;适合深度跟踪系统初始化过程 |
VirtualKD虚拟管道 | 命名管道模拟串口 | 虚拟机内的高效内核调试 | 无需额外硬件投入;传输速度快且支持自动重连机制 |
FAQs
-
问:为什么执行kdnet命令后无法建立连接?
答:常见原因包括防火墙阻止了指定端口、Host与Target不在同一子网或密钥不一致,可通过ping测试连通性,并暂时关闭防火墙进一步验证,若仍失败,建议检查BIOS中的安全启动设置是否已禁用。 -
问:如何在Linux系统中调试动态加载的内核模块?
答:需先获取模块在内存中的基地址(例如通过cat /sys/module/kvm/sections/.text
),然后在GDB中使用add-symbol-file
命令手动加载对应路径下的符号表文件,最后即可在该模块代码段设置