Zephyr程序调试解析1 概述1.1 GDB client1.2 GDB server1.3 runner1.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 serverGDB server负责GDB和板子之间的翻译。GDB 自己不会直接去操SWD/JTAG也不会直接控制探针它是通过GDB remote protocol连到server再由server去驱动调试探针、访问目标板。最常见的GDB server/host tool有这些OpenOCD开源免费支持很多 SoC可以搭配多种调试器但体系复杂排错成本较高。J-Link GDB ServerSEGGER提供配合J-Link探针使用GDB通过它去控制J-Link和目标板。pyOCDArm生态下开源GDB server对CMSIS-DAP支持友好主要适合Cortex-M调试。ST-LINK GDB ServerST的官方GDB serverZephyr支持通过west attach、west debug、west debugserver使用它。。Black Magic Probe探针固件直接包含GDB server 功能无需单独的host-tool程序。1.3 runnerrunner是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 EDUJ-Link PLUSJ-Link ULTRAJ-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 jlinkSEGGER 提供的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可以搭配多种软件使用STM32CubeProgrammerSTM32CubeCLTOpenOCDJ-Link Debug Host Tools。其中STM32CubeProgrammer 主要用于烧录west flash-r stm32cubeprogrammerSTM32CubeCLT 中包含 ST-LINK GDB Server可以用于调试west debug-r stlink_gdbserver west debugserver-r stlink_gdbserver west attach-r stlink_gdbserver也可以使用 OpenOCDwest flash-r openocd west debug-r openocdST-LINK的优点是STM32官方支持好很多开发板自带不需要额外购买调试器性价比很高。缺点是速度和高级调试能力通常不如J-Link在OpenOCD下可能会遇到兼容问题。2.3 DAPLink/CMSIS-DAP方案DAPLink是基于CMSIS-DAP的开源调试方案常见于Arm Cortex-M开发板。它通常不仅提供调试功能还会同时提供USB 虚拟串口USB 大容量存储设备拖拽式烧录CMSIS-DAP 调试接口。在 Zephyr中DAPLink/CMSIS-DAP常搭配下面工具使用pyOCDOpenOCDNXP LinkServer。常见命令如下west flash-r pyocd west debug-r pyocd west flash-r openocd west debug-r openocd2.4 NXP板载调试器方案NXP很多开发板上会集成板载调试器。这类调试器通常由板子上的第二颗MCU实现既可以负责调试也可以提供USB转串口、拖拽烧录等功能。NXP常见板载调试器有三类MCU-Link、LPC-Link2和OpenSDA。1MCU-LinkMCU-Link默认通常使用CMSIS-DAP固件可以搭配NXP 的 LinkServer使用。常用命令west flash-r linkserver west debug-r linkserverMCU-Link也可以刷成J-Link固件刷入后就可以走J-Link 工具链west flash-r jlink west debug-r jlink2LPC-Link2支持多种固件有CMSIS-DAP、J-Link、DAPLink。官方推荐使用CMSIS-DAP固件配合 LinkServer。3OpenSDA可以刷入不同固件有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 核心要点知道工具之间的关系。会改配置知道为什么这么改。碎片知识拼成完整调试链路。