当前位置: 首页 > news >正文

【Zephyr开发系列-7】Zephyr程序调试解析

Zephyr程序调试解析

  • 1 概述
    • 1.1 GDB client
    • 1.2 GDB server
    • 1.3 runner
    • 1.3 west调试指令
    • 1.6 ELF文件
    • 1.7 launch.json文件
  • 2 调试工具选择
    • 2.1 J-Link方案
    • 2.2 ST-LINK方案
    • 2.3 DAPLink/CMSIS-DAP方案
    • 2.4 NXP板载调试器方案
    • 2.5 Black Magic Probe方案
  • 3 核心要点

1 概述

调试就是对CPU进行“暂停、检查、追踪、回放”去查找定位bug的过程。在VS Code中点击Debug开始,内部会执行非常多的步骤,有时候其中一个参数或步骤出错都会导致调试失败,这种很是让人抓狂,所以了解整个Debug建立流程很有必要。流程如下图(建议电脑观看):

1.1 GDB client

简单来说,GDB client负责“理解程序”,常简称为GDB。GDB就是开发者真正操作的调试器,最常见的是交叉工具链里的 arm-zephyr-eabi-gdb。它负责读取zephyr.elf里的符号和调试信息,然后完成下断点、单步、查看变量、查看寄存器、查看调用栈这些动作。在上面VS Code链路里,cppdbg会启动GDB client,连接server后按launch.json里的 setupCommands 去执行 target remote、load、monitor reset之类的命令。

1.2 GDB server

GDB server负责GDB和板子之间的翻译。GDB 自己不会直接去操SWD/JTAG,也不会直接控制探针;它是通过GDB remote protocol连到server,再由server去驱动调试探针、访问目标板。最常见的GDB server/host tool有这些:

  • OpenOCD:开源免费,支持很多 SoC,可以搭配多种调试器,但体系复杂排错成本较高。
  • J-Link GDB Server:SEGGER提供,配合J-Link探针使用;GDB通过它去控制J-Link和目标板。
  • pyOCD:Arm生态下开源GDB server,对CMSIS-DAP支持友好,主要适合Cortex-M调试。
  • ST-LINK GDB Server:ST的官方GDB server,Zephyr支持通过west attach、west debug、west debugserver使用它。。
  • Black Magic Probe:探针固件直接包含GDB server 功能,无需单独的host-tool程序。

1.3 runner

runner是west调试指令和调试工具之间的翻译。runner是west用来包装各种flash & debug host tool的适配层。runner 决定用哪套后端工具,并将参数翻译给J-Link/OpenOCD/pyOCD/ST-LINK,对应的GDB server再真正连板子。

1.3 west调试指令

Zephyr烧录调试界的总调度。
west flash:把固件烧进板子。
west debug:启动 GDB 调试,一般会连上调试服务器,必要时重新烧写 flash,然后进入一个调试器界面。
west debugserver:只启动调试服务器,等外部 GDB 来连接。
west attach:附加到已经在板子上跑的程序,不重新烧录,然后进入一个调试界面。

1.6 ELF文件

ELF不是单纯的“程序文件”,而是把机器码、内存布局、符号表、重定位信息、调试信息都装在一起的容器。在主机上调试时,GDB非常依赖ELF里的符号和调试信息。Zephyr构建系统会把这个文件生在build目录里,默认名字是zephyr.elf;如果CONFIG_KERNEL_BIN_NAME改了,那输出名也会跟着变。

1.7 launch.json文件

VS Code调试的配置文件。它告诉VS Code:要调哪个ELF、用哪个GDB、怎么启动debug server、连哪个端口、连上后执行哪些GDB命令。J-Link示例:

{"version":"0.2.0","configurations":[{"name":"Zephyr Workbench Debug [primary]","type":"cppdbg","request":"launch","cwd":"${workspaceFolder}","program":"${workspaceFolder}/build/primary/zephyr/zephyr.elf","args":[],"stopAtEntry":true,"svdPath":"C:\\ST\\STM32CubeCLT_1.21.0\\STMicroelectronics_CMSIS_SVD\\STM32H743.svd","environment":[],"externalConsole":false,"serverLaunchTimeout":30000,"filterStderr":true,"filterStdout":true,"serverStarted":"J-Link GDB server running on port 2331","MIMode":"gdb","miDebuggerPath":"${config:zephyr-workbench.sdk}\\gnu\\arm-zephyr-eabi\\bin\\arm-zephyr-eabi-gdb.exe","debugServerPath":"${workspaceFolder}/build/primary/.debug/west_wrapper.bat","debugServerArgs":"debugserver --build-dir \"${workspaceFolder}/build/primary\" --runner jlink --gdb-port 2331","setupCommands":[{"text":"-environment-cd ${workspaceFolder}/build/primary/zephyr"},{"text":"-target-select remote localhost:2331","description":"connect to target","ignoreFailures":false},{"text":"-file-exec-and-symbols zephyr.elf","description":"load file","ignoreFailures":false},{"text":"-interpreter-exec console \"monitor reset\"","ignoreFailures":false},{"text":"-target-download","description":"flash target","ignoreFailures":false},{"text":"set breakpoint pending on","description":"Set pending","ignoreFailures":false},{"text":"tbreak main","description":"Set a breakpoint at main","ignoreFailures":true}],"logging":{"moduleLoad":true,"trace":true,"engineLogging":true,"programOutput":true,"exceptions":true}}]}

2 调试工具选择

从前面介绍可知,烧录和调试并不是由某一个工具单独完成的,而是由一整套工具链配合完成。
Zephyr官方将主机端用于烧录、调试的工具称为Flash & Debug Host Tools。这些工具运行在电脑上,负责和调试器、开发板或Bootloader通信,完成程序下载、启动调试服务、连接GDB等操作。
而Debug Probe一般来说指的是调试探针或调试器或仿真器,它是一种专门的硬件,负责程序调试和烧录的硬件支撑。
不同工具支持的命令不完全一样,有些工具只适合特定厂商或特定芯片。以下主要围绕几种主流方案介绍,详细内容请参阅官方文档。

2.1 J-Link方案

J-Link是嵌入式领域最常见、最成熟的调试方案之一。它既可以指SEGGER的外置J-Link调试器,也可以指某些板载调试器刷入J-Link固件后的形态。常见硬件包括:

  • J-Link EDU;
  • J-Link PLUS;
  • J-Link ULTRA+;
  • J-Link PRO。

在Zephyr中,J-Link通常搭配J-Link Debug Host Tools使用,也可以在部分场景下配合OpenOCD使用。命令:

west flash-r jlink west debug-r jlink west debugserver-r jlink west attach-r jlink

SEGGER 提供的J-Link工具软件包含:

  • J-Link GDB Server:用于GDB远程调试;
  • J-Link Commander:用于命令行烧录和设备控制;
  • RTT Viewer:用于查看 RTT 日志;
  • SystemView:用于实时事件记录和分析。
    J-Link的优点是速度快、稳定性好、芯片支持范围广、生态成熟。缺点是正版价格比较高,个人用户成本较大。
    如果是商用项目,或者希望调试过程尽量省心,J-Link通常是非常稳妥的选择。

2.2 ST-LINK方案

ST-LINK是ST常见的调试器,广泛集成在STM32官方开发板上,也有独立的ST-LINK/V2、ST-LINK/V3、STLINK-V3PWR等硬件。
在Zephyr中,ST-LINK可以搭配多种软件使用:

  • STM32CubeProgrammer;
  • STM32CubeCLT;
  • OpenOCD;
  • J-Link Debug Host Tools。

其中,STM32CubeProgrammer 主要用于烧录:

west flash-r stm32cubeprogrammer

STM32CubeCLT 中包含 ST-LINK GDB Server,可以用于调试:

west debug-r stlink_gdbserver west debugserver-r stlink_gdbserver west attach-r stlink_gdbserver

也可以使用 OpenOCD:

west flash-r openocd west debug-r openocd

ST-LINK的优点是STM32官方支持好,很多开发板自带,不需要额外购买调试器,性价比很高。缺点是速度和高级调试能力通常不如J-Link,在OpenOCD下可能会遇到兼容问题。

2.3 DAPLink/CMSIS-DAP方案

DAPLink是基于CMSIS-DAP的开源调试方案,常见于Arm Cortex-M开发板。它通常不仅提供调试功能,还会同时提供:

  • USB 虚拟串口;
  • USB 大容量存储设备;
  • 拖拽式烧录;
  • CMSIS-DAP 调试接口。
    在 Zephyr中,DAPLink/CMSIS-DAP常搭配下面工具使用:
  • pyOCD;
  • OpenOCD;
  • NXP LinkServer。

常见命令如下:

west flash-r pyocd west debug-r pyocd west flash-r openocd west debug-r openocd

2.4 NXP板载调试器方案

NXP很多开发板上会集成板载调试器。这类调试器通常由板子上的第二颗MCU实现,既可以负责调试,也可以提供USB转串口、拖拽烧录等功能。NXP常见板载调试器有三类:MCU-Link、LPC-Link2和OpenSDA。

1)MCU-Link:MCU-Link默认通常使用CMSIS-DAP固件,可以搭配NXP 的 LinkServer使用。

常用命令:

west flash-r linkserver west debug-r linkserver

MCU-Link也可以刷成J-Link固件,刷入后就可以走J-Link 工具链:

west flash-r jlink west debug-r jlink

2)LPC-Link2:支持多种固件有CMSIS-DAP、J-Link、DAPLink。官方推荐使用CMSIS-DAP固件配合 LinkServer。
3)OpenSDA:可以刷入不同固件有OpenSDA DAPLink、OpenSDA J-Link。
NXP方案的优点是和NXP官方生态结合紧密,尤其适合MCUXpresso、LPC、i.MX RT等开发环境。缺点是固件类型比较多,使用前要先确认板载调试器到底刷的是什么固件,否则Host Tool可能识别不到。

2.5 Black Magic Probe方案

Black Magic Probe是一个比较特殊的开源调试器。它把 GDB Server直接集成到了调试器固件中,所以不需要额外运行OpenOCD、J-Link GDB Server 或 pyOCD等GDB Server。
它的优点是开源、GDB 可以直接连接;缺点是芯片支持范围不如J-Link,生态不如J-Link/OpenOCD。

3 核心要点

  • 知道工具之间的关系。
  • 会改配置,知道为什么这么改。
  • 碎片知识拼成完整调试链路。
http://www.cnnetsun.cn/news/2935936.html

相关文章:

  • 5分钟搞定音频字幕:Open-Lyrics智能转录翻译完整指南
  • QUICC Engine子系统:嵌入式通信硬件加速与多线程机制解析
  • 阿里JDK源码核心剖析:程序员进阶必备!
  • SK-H1-ASICBD-D1030控制器模块
  • java毕业设计下载(全套源码+配套论文)——基于java+原生Sevlet+socket的聊天室系统设计与实现
  • Agent Scope Java 2.x 系列【17】Harness:工作区远程存储模式
  • 移动端工程师进阶:AI原生App,月薪20K到35K的秘密
  • RTD2166-CG,内置 MCU 实现 DP-VGA 无缝转换
  • GTA5线上小助手:完全免费的洛圣都游戏增强神器终极指南
  • 3步解锁B站大会员4K视频下载:专业工具全攻略
  • 2026 最新 PS 抠图白边彻底消除教程(无痕无损)
  • 如何轻松下载B站4K高清视频:3分钟搞定会员专属内容
  • MPC866通信处理器SDMA/IDMA与串行接口(TSA)配置详解
  • 别再乱用`torch.cat`和`torch.stack`了!详解张量拼接与维度对齐的常见坑(附解决方案)
  • 告别盲目调参!手把手教你用ENVI官方插件和脚本,高效玩转遥感影像深度学习
  • 深度解析:douyin-live-go如何构建高性能抖音直播数据采集系统
  • 终极Office激活方案:Ohook免费解锁Microsoft 365完整功能指南
  • QRazyBox:让损坏的二维码重获新生的专业修复工具
  • 三步免费解锁Wand专业版:开源增强工具完整使用指南
  • 【Springboot毕设全套源码+文档】基于springboot+vue的民宿信息管理系统(丰富项目+远程调试+讲解+定制)
  • 团队编程协作方案:从代码到Wiki的高效落地实践
  • PXD10 QuadSPI接口深度解析:双模式设计、内存映射与低功耗实战
  • 嵌入式系统性能剖析:从硬件计数器到跟踪缓冲器的实战指南
  • 嵌入式工程师必看:手把手教你排查PHY芯片挂载失败(从供电到MDIO波形全流程)
  • PXS20微控制器ADC自测试与时钟配置:功能安全与高可靠信号采集实战
  • 计算机毕业设计之java-微信小程序的律师事务所服务平台
  • LLM 应用的成本优化策略:从 Token 精简到模型分层的实战路径
  • 2026年AI写作辅助平台对比实测:5款神器从构思到提交全流程护航
  • ExDark:破解低光照计算机视觉难题的7363张图像数据集解决方案
  • 终极D2DX宽屏补丁:让暗黑破坏神2在现代PC上完美重生