5.5 在线调试与断点视图
ChipON VSCode Extension 基于定制优化的 LLDB + OpenOCD 架构,为 KF32 系列微控制器提供专业的嵌入式在线调试体验,支持硬件断点、数据观察点、外设寄存器位域解析、内存直接读写、源码-反汇编对照以及 FreeRTOS 实时内核监控。
调试配置
项目的调试任务定义在 .vscode/launch.json 文件中。新建工程时插件默认预置了两种模式:
{
"version": "0.2.0",
"configurations": [
{
"name": "KF32-LLDB: Launch",
"type": "kf32-lldb",
"request": "launch",
"programBeforeDebug": false,
"startSettings": {
"startmode": "main",
"port": 3333
}
},
{
"name": "KF32-LLDB: Attach",
"type": "kf32-lldb",
"request": "attach",
"startSettings": {
"startmode": "halt",
"port": 3333,
"openocdReadyTimeout": 5000
}
}
]
}
调试核心参数解析
| 参数项 | 数据类型 | 说明 |
|---|---|---|
name | String | 该调试会话配置在 VSCode 调试下拉栏中的显示名称 |
type | String | 调试适配器类型,固定为 kf32-lldb |
request | String | 启动请求类型,支持 launch(烧录并启动调试)与 attach(附加到当前正在运行的芯片) |
elfPath | String (可选) | 目标可执行 ELF 文件路径。默认无需配置,插件会自动拉取当前 Build Preset 生成的 .elf 文件 |
programBeforeDebug | Boolean | 进入调试会话前是否先触发烧录(默认为 false) |
startSettings.startmode | String | 启动行为。launch 模式下为 main(停在主入口),attach 模式下为 halt(立即挂起) |
startSettings.port | Number | GDB/LLDB Server 与芯片通信的端口号(默认 3333) |
startSettings.openocdReadyTimeout | Number | 调试底层服务初始化超时时间,单位毫秒(默认 5000 ms) |
自定义 OpenOCD 配置文件
除内置 OpenOCD 模板外,插件支持使用项目内的自定义配置文件启动 OpenOCD。只要项目根目录下存在 .vscode/chipon_openocd.cfg,调试(Launch / Attach)以及通过 OpenOCD 执行的烧录流程都会使用该文件,无需修改 launch.json。
生成配置文件
可通过以下任一方式生成:
- PROJECTS 视图:右键项目根节点,选择 生成 OpenOCD 配置文件。
- 命令面板:按 Ctrl + Shift + P,执行
ChipON: 生成 OpenOCD 配置文件(命令 ID:chipon.generateOpenocdCfg)。
插件会根据当前芯片选择对应的内置模板,生成 .vscode/chipon_openocd.cfg 并自动打开。文件顶部的注释列出了全部可用占位符及其含义。
若 .vscode/chipon_openocd.cfg 已存在,生成前会提示是否覆盖,覆盖后自定义内容将丢失。
模板变量
配置文件中可使用以下占位符,启动 OpenOCD 时由插件自动替换:
| 占位符 | 说明 |
|---|---|
{{activePath}} | KFLINK 虚拟串口设备路径;Windows 下形如 //./COMx,使用 J-Link 时为空 |
{{startmode}} | 调试请求类型,取值为 launch 或 attach(来自 launch.json 的 request) |
{{debugKeyLine}} | KFLINK 调试鉴权行;未配置鉴权密文时为空 |
{{range}} | 当前芯片的 range 值 |
{{port}} | GDB Server 端口,默认 3333,对应 startSettings.port |
{{openocdid}} | 每次启动 OpenOCD 时生成的唯一 ID |
使用说明
- 占位符在每次启动 OpenOCD 时重新渲染;插件渲染的是临时副本,不会修改
.vscode/chipon_openocd.cfg源文件。 - 双花括号
{{ }}为插件保留语法,请勿用于其他用途;插件无法识别的占位符会被渲染为空字符串,可能导致 OpenOCD 报错。 - 修改配置文件后,重新启动调试或烧录即可生效。
- 删除
.vscode/chipon_openocd.cfg后,插件会自动回退到内置模板。 - 通过 OpenOCD 烧录时,
{{activePath}}、{{startmode}}、{{debugKeyLine}}渲染为空,请避免在这些流程中依赖上述变量。
示例
生成文件的核心内容如下(占位符保留原样):
adapter driver kflink
kflink backend vcp
kflink vcp port {{activePath}}
kflink mode A
kflink startmode {{startmode}}
{{debugKeyLine}}
transport select dpi
set _CHIPNAME kf32
dpi newtap $_CHIPNAME cpu
target create $_CHIPNAME.cpu kf32_{{range}} -chain-position $_CHIPNAME.cpu
gdb breakpoint_override hard
启动调试会话
开发者可通过以下任一方式启动调试:
- PROJECTS 视图:展开项目根节点,点击右侧的 调试 (Debug) 图标(🐞),或右键选择 Show Debug。
- 运行与调试视图:按快捷键 Ctrl + Shift + D 打开 VSCode 原生调试侧边栏,选择目标配置后按 F5。


调试操作
进入调试会话后,编辑器顶部将显示调试浮动工具栏,提供对目标微控制器的执行控制:
| 图标 | 操作 | 快捷键 | 功能说明 |
|---|---|---|---|
| Continue (继续运行) | F5 | 继续全速运行程序,直到命中下一个断点或发生异常 | |
| Step Over (单步跳过) | F10 | 执行当前行代码。遇到函数调用时执行完函数整体,停在下一行 | |
| Step Into (单步进入) | F11 | 执行当前行代码。遇到函数调用时步入该函数体首行 | |
| Step Out (单步跳出) | Shift+F11 | 执行完当前函数并跳出,返回上一层调用处 | |
| Reset (芯片复位) | — | 点击调试浮动栏中的绿色复位图标,重置芯片并停在 startup 启动函数入口 | |
| Stop (停止调试) | Shift+F5 | 断开与调试器的连接,终止当前调试会话 |
当当前处于反汇编视图(Disassembly View)时,Step Over 与 Step In 的单步步长将自动由“源代码行”切换为“单条汇编机器指令”。
各控制操作界面展示
-
Continue 操作:

-
Step Over 操作:

-
Step In 操作:

-
Reset 芯片复位操作:

调试断点
KF32 芯片硬件断点单元具备数量限制:
- 程序断点(普通/条件/触发/日志断点共用):硬件支持最多 4 个
- 数据观察点 (Watchpoint):硬件支持最多 2 个
超过硬件限制时,多余断点可能无法成功触发或导致调试器报错。
1. 普通行断点 (Line Breakpoint)
- 设置:在源文件或反汇编视图的行号左侧单击,出现红色实心圆点。
- 管理:右击断点可选择禁用/启用,也可在调试面板的 BREAKPOINTS 列表中统一勾选控制。

2. 条件断点 (Conditional Breakpoint)
- 设置:在行号左侧单击右键,选择 Add Conditional Breakpoint...。
- 求值规则:支持输入由 LLDB 动态求值的 C 语法布尔表达式,如
i == 10或ptr != 0 && *ptr == 0x5A。满足条件时才挂起程序。

3. 触发断点 (Triggered Breakpoint)
- 概念:仅在指定的“父断点”被命中至少一次后,该断点才会被激活。
- 设置:在行号左侧右键选择 Add Triggered Breakpoint...,并关联前置断点。


4. 日志断点 (Logpoint)
- 概念:命中断点时不暂停程序执行,而是将格式化信息打印至 Debug Console 调试控制台,常用于替代嵌入式代码中的临时
printf。 - 设置:右键行号选择 Add Logpoint...,直接输入插值字符串(如
Counter val: {g_counter})。

5. 数据观察点 (Watchpoint)
- 概念:对特定变量或物理内存地址的读/写/读写操作进行实时监控,当目标地址被访问时自动挂起。
- 设置:在 Variables 变量列表中右键变量选择 Break on Value Change,或在 BREAKPOINTS 面板点击 Add Data Breakpoint at Address 手动指定起始地址与检测长度。

调试专业视图
VSCode 运行与调试界面提供了 8 类专业嵌入式视图:
1. Variables (变量视图)
实时展示当前函数调用栈帧中的局部变量(Local)、静态变量(Static)、全局变量(Global)以及内核寄存器(Registers)。
- 实时刷新:单步执行时变动数值将以高亮颜色标记;
- 在线改值:双击数值可直接修改变量当前内存值;
- 结构体展开:支持展开结构体、数组及指针成员。

2. Watch (监视视图)
允许开发者手动添加常驻监视表达式,即使变量离开了当前局部作用域,仍会持续跟踪其全局值或复杂运算式(如 g_sensor.data[0] * 3.3 / 4096)。

3. Call Stack (函数调用堆栈视图)
时间倒序展示当前中断或暂停发生时的函数调用链。点击各栈帧可回溯调用处源码上下文;右键某帧选择 Open Disassembly View 可展开该函数对应的机器反汇编。


4. Breakpoints (断点管理视图)
统一检索和批量管理当前工作区中的所有断点,支持一键临时禁用全部断点(Deactivate Breakpoints)或按需移除。

5. Memory (内存查看与编辑视图)
以十六进制(HEX)和 ASCII 码双格式展现目标芯片内存的原始内容,支持排查缓冲区越界、指针错位及堆栈溢出。
- 唤出方式:在变量视图右键选择 Show in Memory Inspector,或按快捷键通过命令面板执行
Show Memory Inspector; - 交互:输入物理地址或表达式(如
0x20000000或&my_buffer)即可精准定位;双击十六进制单元可直接覆写内存字节。


6. Peripheral Registers (外设寄存器视图)
嵌入式开发专属视图,将微控制器内部特殊功能寄存器(SFR)的抽象地址直观还原为具体外设(如 GPIOA、USART1、CAN0)。
- 位域拆解 (Bitfields):将 32 位寄存器按位拆解为独立控制字段(如
ENABLE,MODE,PRESCALER),显示独立标志位状态; - 实时控制:在调试暂停时可直接勾选或修改位域值,实现不重新编译直接在线点灯、配置波特率或清除中断标志;
- 过滤筛选:支持通过右上角过滤按钮筛选仅显示当前关注的外设模块。
外设寄存器视图仅在调试会话处于激活且微控制器处于 暂停 (Paused) 状态时方可读取并渲染数据。




7. Disassembly (反汇编视图)
显示当前 CPU 实际执行的底层机器汇编指令,标有精确内存地址、相对函数入口偏移量及十六进制机器码,并支持汇编与 C 语言源码交替对照。

8. OS View (FreeRTOS 实时内核监控)
专用于监控基于 FreeRTOS 操作系统的嵌入式任务体系。插件在目标挂起时通过读取芯片内存中的 FreeRTOS 内核控制块,可视化呈现系统运行状态:
- Task:任务列表、执行状态(Ready/Blocked/Running)、优先级与堆栈剩余水位线;
- Timer:软件定时器列表与剩余计时周期;
- Queue:消息队列使用率与阻塞等待任务;
- Dump:内核系统级状态转储。
OS View 仅支持运行了 FreeRTOS 内核的固件,且仅在调试暂停(Halt)状态下动态拉取并刷新内核数据。
