3、调试环境搭建:串口调试线连接、网络调试配置、kgdb调试器设置、目标机与宿主机通信

好,咱们直接进入正题。调试环境搭建,这是所有驱动调试工作的基础。你想想看,如果连目标机和宿主机都聊不上天,那后面所有的分析工具都是空中楼阁。我个人习惯先把物理链路搞定,再搞网络,最后上调试器。这个顺序踩坑最少。

3.1 串口调试线连接——最原始的保底手段

串口这东西,看着老土,但关键时刻真能救命。我在项目中遇到过好几次网络挂掉、系统起不来的情况,最后全靠一根串口线把日志扒出来。

硬件连接要点:

  • 确认目标板上的UART引脚定义——TX、RX、GND,这三根线必须接对
  • 电平匹配:3.3V还是1.8V?别直接怼5V的USB转串口,会烧芯片
  • 流控(RTS/CTS)一般不用接,除非你跑高速波特率

软件配置:

# 宿主机端(Linux/macOS)
screen /dev/ttyUSB0 115200 8N1

# 或者用 minicom
minicom -D /dev/ttyUSB0 -b 115200

# Windows 下用 PuTTY 或 SecureCRT
# 串口参数:115200波特率,8数据位,无校验,1停止位
我的小技巧: 串口线不要太长,超过3米容易丢数据。如果必须长距离传输,用RS232电平转换或者加隔离器。

嗯,这里要注意:QNX默认的串口终端是serial驱动。你需要在构建系统时把devc-ser*驱动加进去。我记得有一次忘了加这个驱动,串口死活没输出,折腾了半天才发现是构建配置漏了。

3.2 网络调试配置——高效调试的基石

串口虽然稳,但速度太慢。传个内核镜像得等半天。所以网络调试才是主力。说白了,就是让目标机和宿主机在同一个网段里,能互相ping通。

网络配置步骤:

  1. 目标机IP设置——在QNX启动后,用ifconfig配IP
  2. 宿主机IP设置——确保和目標机在同一子网
  3. 路由检查——如果跨网段,记得加默认网关
  4. 连通性测试——互ping,看丢包率和延迟
# 目标机QNX侧
ifconfig en0 192.168.1.100 netmask 255.255.255.0 up
route add default 192.168.1.1

# 宿主机侧
ifconfig eth0 192.168.1.200 netmask 255.255.255.0 up
ping 192.168.1.100
避坑指南: 我曾经遇到过目标机和宿主机明明在同一个交换机上,但就是ping不通。最后发现是交换机的端口隔离(Port Isolation)功能开了。所以,如果网络不通,先检查交换机配置,别光盯着IP地址。

网络调通了,后面的事情就好办了。你可以用ftp传文件,用ssh远程登录,甚至挂载NFS文件系统。我个人习惯用NFS,这样宿主机上编译好的驱动模块,目标机直接就能加载,省去了反复拷贝的麻烦。

3.3 kgdb调试器设置——内核级断点调试

kgdb,全称是Kernel GNU Debugger。它允许你在内核代码里下断点、单步执行、查看变量。说白了,就是给内核做“手术”时用的显微镜。

kgdb的工作模式:

  • 串口kgdb——通过串口线连接,稳定但慢
  • 网络kgdb——通过以太网连接,速度快但配置复杂
  • 本地kgdb——在目标机上直接运行gdb,适合简单调试

串口kgdb配置示例:

# 在QNX构建配置中启用kgdb
# 修改 buildfile,添加以下内容
[+kgdb]
/proc/boot/startup-script

# 启动时传入kgdb参数
# 在QNX命令行中
kgdb -d /dev/ser1 -b 115200

# 宿主机侧启动gdb
qnx-gdb vmlinux
(gdb) target remote /dev/ttyUSB0
(gdb) continue
重要提醒: kgdb需要内核编译时开启调试符号(-g选项)。如果没有调试符号,你看到的全是汇编代码,没法关联到C源码。我建议在开发阶段始终保留调试符号,发布时再strip掉。

为什么会这样?因为kgdb本质上是在内核中嵌入了一个调试桩(debug stub)。当断点触发时,内核暂停执行,把控制权交给调试桩,然后通过串口或网络与宿主机上的gdb通信。这个过程对实时性有影响,所以生产环境一般不开启。

3.4 目标机与宿主机通信——打通任督二脉

前面三步都是铺垫,这一步才是关键。目标机和宿主机之间要能顺畅地交换数据,调试才能进行下去。

通信方式对比:

方式 速度 稳定性 适用场景
串口 慢(115200bps) 极高 早期启动、内核崩溃调试
以太网 快(100Mbps+) 日常开发、驱动加载测试
USB 中(USB 2.0) 特殊硬件、无网口场景
PCIe 极快 极高 高性能调试、硬件仿真

通信验证步骤:

  1. 基础连通性——ping通是最低要求
  2. 文件传输——用ftp或scp传一个测试文件,确认双向都OK
  3. 远程shell——通过ssh或rsh登录目标机,执行命令
  4. 调试会话——启动kgdb或gdb,确认断点能命中
我的经验: 如果条件允许,我建议同时保留串口和网络两条通道。串口用来打印启动日志和紧急情况,网络用来传输数据和调试。两条腿走路,总比一条腿稳当。

嗯,最后再啰嗦一句:调试环境搭建好了,别急着开始调试。先跑一个简单的测试程序,确认整个链路是通的。我曾经犯过这个错——花了半天时间搭环境,结果发现串口线是坏的,白白浪费了时间。

好,这一章就到这里。下一章我们讲如何用tracelogger抓取内核事件,那是性能分析的利器。