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停止位
嗯,这里要注意:QNX默认的串口终端是serial驱动。你需要在构建系统时把devc-ser*驱动加进去。我记得有一次忘了加这个驱动,串口死活没输出,折腾了半天才发现是构建配置漏了。
3.2 网络调试配置——高效调试的基石
串口虽然稳,但速度太慢。传个内核镜像得等半天。所以网络调试才是主力。说白了,就是让目标机和宿主机在同一个网段里,能互相ping通。
网络配置步骤:
- 目标机IP设置——在QNX启动后,用
ifconfig配IP - 宿主机IP设置——确保和目標机在同一子网
- 路由检查——如果跨网段,记得加默认网关
- 连通性测试——互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
网络调通了,后面的事情就好办了。你可以用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本质上是在内核中嵌入了一个调试桩(debug stub)。当断点触发时,内核暂停执行,把控制权交给调试桩,然后通过串口或网络与宿主机上的gdb通信。这个过程对实时性有影响,所以生产环境一般不开启。
3.4 目标机与宿主机通信——打通任督二脉
前面三步都是铺垫,这一步才是关键。目标机和宿主机之间要能顺畅地交换数据,调试才能进行下去。
通信方式对比:
| 方式 | 速度 | 稳定性 | 适用场景 |
|---|---|---|---|
| 串口 | 慢(115200bps) | 极高 | 早期启动、内核崩溃调试 |
| 以太网 | 快(100Mbps+) | 高 | 日常开发、驱动加载测试 |
| USB | 中(USB 2.0) | 中 | 特殊硬件、无网口场景 |
| PCIe | 极快 | 极高 | 高性能调试、硬件仿真 |
通信验证步骤:
- 基础连通性——ping通是最低要求
- 文件传输——用ftp或scp传一个测试文件,确认双向都OK
- 远程shell——通过ssh或rsh登录目标机,执行命令
- 调试会话——启动kgdb或gdb,确认断点能命中
嗯,最后再啰嗦一句:调试环境搭建好了,别急着开始调试。先跑一个简单的测试程序,确认整个链路是通的。我曾经犯过这个错——花了半天时间搭环境,结果发现串口线是坏的,白白浪费了时间。
好,这一章就到这里。下一章我们讲如何用tracelogger抓取内核事件,那是性能分析的利器。