当前位置:首页 > 物理机 > 正文

物理机双机调试设置

机双机调试需配置相同网络段IP,启用心跳检测与仲裁机制,同步时钟源,交叉连接业务端口并

Windows系统下的网络调试方案(基于Windbg)

  1. 准备工作

    • Host端操作:下载并安装Windows SDK以获取Windbg工具;将指定文件(Debuggersx64kdnet.exeVerifiedNICList.xml)从Windbg安装目录复制到Target端。
    • 网络要求:若Target为物理机,则需确保与Host处于同一局域网;若为虚拟机,应采用桥接模式并关闭两台设备的Secure Boot(在BIOS中设置)。
  2. 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)”。
  3. Host端连接调试

    • 打开Windbg或其预览版,依次点击菜单栏的File → Start debugging → Attach to kernel → Net,填入Target端生成的端口号(如50015)及对应的密钥(即上述结果中的key值),确认后即可启动调试,此时重启Target机器便能正常进行调试交互。

Linux内核双机调试方案(串口通信)

  1. 硬件准备与测试

    • 需要两根物理机、一套串口转USB线缆以及Linux源码,将串口端接入Target机的ttyS1接口,USB端连接至Host机的对应接口,双方安装Cutecom软件验证通信功能:在Host端打开设备/dev/ttyUSB0,Target端打开/dev/ttyS1,通过互发数据确认连接正常。
  2. Target端编译与启动设置

    • 编译内核时需勾选以下选项:KGDB, KGDB_SERIAL, KGDB_USB, DEBUG_INFO, DEBUG_INFO_DWARF4, MAGIC_SYSRQ,修改/etc/default/grub文件中的GRUB_CMDLINE_LINUX参数,添加nokaslr以固定内核加载地址,随后执行sudo update-grub更新配置并重启系统。
  3. 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 [内存地址]指定模块基址。

通用注意事项与扩展场景

  1. 传输速率优化:相较于传统串口,VirtualKD工具可显著提升数据传输效率,尤其适用于虚拟机环境,其原理是基于内核调试引擎的扩展DLL功能,通过管道模拟高速通信通道。

  2. 网络调试限制:并非所有网卡均支持内核级网络调试,具体兼容列表可参考微软官方文档,目标系统必须为Win8及以上版本才能启用相关功能。

  3. 故障排查技巧:若遇到连接失败问题,建议优先检查BIOS中的安全启动选项是否已禁用;同时验证两端IP地址、端口号及密钥是否完全匹配,对于Linux系统,可通过dmesg查看是否成功注册I/O驱动kgdboc来快速定位问题点。

调试类型 连接方式 适用场景 优势与劣势对比
Windows网络调试 网线直连/同一局域网 用户态程序、驱动开发 配置简单但依赖特定端口范围;受防火墙影响较大
Linux串口调试 USB转串口线缆 内核协议栈、早期启动流程分析 稳定性高但速率较低;适合深度跟踪系统初始化过程
VirtualKD虚拟管道 命名管道模拟串口 虚拟机内的高效内核调试 无需额外硬件投入;传输速度快且支持自动重连机制

FAQs

  1. :为什么执行kdnet命令后无法建立连接?
    :常见原因包括防火墙阻止了指定端口、Host与Target不在同一子网或密钥不一致,可通过ping测试连通性,并暂时关闭防火墙进一步验证,若仍失败,建议检查BIOS中的安全启动设置是否已禁用。

  2. :如何在Linux系统中调试动态加载的内核模块?
    :需先获取模块在内存中的基地址(例如通过cat /sys/module/kvm/sections/.text),然后在GDB中使用add-symbol-file命令手动加载对应路径下的符号表文件,最后即可在该模块代码段设置

0