代码调试

  1. 硬件准备

  • 调试适配器:支持 DAP-Link (默认) 或 J-Link

  • 调试目标芯片

  1. 连接步骤

  • 将适配器的 SWDIO( SWD )连接到目标芯片的 SWD DATA

  • 将适配器的 SWCLK( CLK )连接到目标芯片的 SWD CLK

  • 将适配器 GND 与目标芯片 GND 连接,确保共地

  • 将适配器通过 USB 连接到 PC

  1. 在插件中选择调试目标芯片

  2. 参考 插件可选配置 (Debug) 选择调试器类型和配置调试参数

  3. 点击 Debug 按钮启动集成的调试器,开始代码调试

备注

  1. RTL8730E KM4 内核调试限制:

  • 调试前需关闭 tickless 功能,否则会影响调试行为。

  1. SWD 引脚差异:

  • 不同芯片/封装的 SWD 引脚位置可能不同,请参考对应 PINMUX 表进行确认。

  1. 连接稳定性:

  • 若连接后无法识别目标,优先检查引脚映射是否正确。

  • 若出现连接不稳,可适当降低 SWD 时钟频率。

调试框架

调试框架如下图所示:

../_images/vsix_diagram_local.svg
  1. 目标芯片通过调试适配器与 PC 相连。

  2. 启动调试时, OpenOCD( GDB 服务器)启动。你可以在 VS Code 的终端( gdb-server )查看 OpenOCD 输出日志与状态。

  3. 工具链内置的 GDB 连接到 OpenOCD ,随后即可进行调试操作。

基础调试技巧

  1. 调试工具栏

  • 继续:恢复程序运行(默认快捷键 F5 )。

  • 暂停:暂停当前运行的程序(默认快捷键 F6 )。

  • 逐过程:执行当前行但不进入函数内部(默认快捷键 F10 )。

  • 单步调试:逐语句执行并进入函数内部(默认快捷键 F11 )。

  • 单步跳出:从当前函数返回到上层(默认快捷键 Shift+F11 )。

  1. 变量

这是调试时最常用的视图,它会显示当前程序停止位置可见的所有数据。系统会自动分类:

  • Local: 当前函数作用域内的局部变量。

  • Global: 全局变量。

  • Static: 当前文件内的静态变量。

  • Registers: 当前 CPU 核的寄存器值。

  1. 断点

断点是调试过程中最常用的工具。当程序运行到断点位置时会自动暂停,允许您检查当前的变量状态或寄存器信息。

断点方式

断点管理

行号点击

添加:在编辑器中,直接点击代码行号左侧的空白区域(点击后会出现红点)

查看:左侧的 断点 面板,这里列出了所有断点的位置

删除:再次点击行号左侧的红点,即可取消该断点

右键菜单

添加:在代码区域点击鼠标右键,选择 Add Hardware Breakpoint

查看:左侧的 断点 面板,这里列出了所有断点的位置

删除:左侧的 断点 面板,选择相应断点删除

调试控制台

添加:程序暂停时,在调试控制台输入 GDB 命令

  • 函数断点: b 函数名

    (示例:b main,在 main 函数入口暂停)

  • 条件断点: b 位置 if 条件

    (示例:b main if count > 10,当条件满足时触发)

  • 线程断点: b 函数名 thread 线程ID

    (示例:b shared_func thread 8,指定线程运行到该函数时触发)

  • 行断点: b 行号

    (示例:b 100,在当前文件第 100 行暂停)

  • 文件行断点: b 文件名:行号

    (示例:b main.c:50,在指定文件的第 50 行暂停)

  • 地址断点: b *地址

    (示例: b *0x08001234,在指定内存地址暂停)

查看: info breakpints 或 info b

删除: delete 断点编号 或 d 断点编号

(示例: delete 2,删除编号为 2 的断点)

备注

不同的芯片架构对硬件断点的数量有限制,超过限制的断点将被视为无效。

  1. 观察点

观察点监视内存地址或变量的变化,当值被读取、写入或修改时中断程序。

观察点方式

观察点管理

右键菜单

添加:程序暂停时,

  • 监视全局变量:在 变量 面板选择全局变量,右键选择 值读取/更改/访问时中断

  • 监视寄存器:在 变量 面板选择寄存器,右键选择 值读取/更改/访问时中断

  • 监视内存地址:在 监视 面板添加内存监视表达式,右键选择 值读取/更改/访问时中断

查看:左侧的 断点 面板,这里列出了所有观察点

删除:左侧的 断点 面板,选择相应观察点删除

调试控制台

添加:程序暂停时,在调试控制台输入 GDB 命令

  • 监视变量值: rwatch/watch/awatch [-l] 变量名

    (示例: watch -l count,当 count 的值发生变化时触发中断)

  • 监视内存地址: rwatch/watch/awatch [-l] *地址

    (示例: watch -l *0x2000b4f8,当地址 0x2000b4f8 的内容发生变化时触发中断)

查看: info watch 或 info watchpoints

删除: delete 观察点编号 或 d 观察点编号

(示例: delete 2,删除编号为 2 的观察点)

备注

不同的芯片架构对观察点的数量有限制,超过限制的观察点将被视为无效。

  1. 监视

监视面板允许你监控你关注的变量。通过以下方式监控:

  • 查看变量:

    • 在代码中右键点击变量 添加到监视。

    • 程序暂停时,在变量面板,右键点击目标变量 添加到监视。

    • 在监视面板中点击 + 号输入变量名。

  • 查看任意内存地址:

    • 直接输入地址转换表达式,例如*(int*)0x20000004 ,即可查看该地址的数值。

    • 内存视图:按 F1 输入 MemoryView 打开专用面板,支持查看大块内存区域的 Hex 数据。

  • 强制类型转换:

    • 支持 C 语言风格的转换,例如 (char*)my_var 以查看字符串的值。

  1. 调用堆栈

当代码逻辑复杂时,调用堆栈能清晰展示 程序执行路径。

  • 层级导航:顶层为当前暂停行,第二层为调用者(父函数),依此类推。点击不同层级可跳转查看当时的上下文变量。

  1. 多核调试控制

启动多核调试后,调用堆栈视图将列出所有核的调试会话。用户可通过点击视图标题栏上的按钮,在以下两种协作模式间进行切换。

模式

说明

Run Sync

  • 含义:同步运行模式。所有核在暂停状态下,对任一核执行调试控制指令(如 继续、 单步调试 等)时,调试器会自动对所有其他关联的核执行相同的操作

  • 目的:保持多核在时间轴上的同步运行,避免因核运行状态不一致,导致共享内存通信异常或逻辑错误

  • 操作:点击 RS 按钮切换

All Stop

  • 含义:全停模式。当任一核触发暂停条件(如断点)时,所有核均会被强制暂停

  • 目的:确保调试现场的全局一致性;若关闭此模式,则允许对目标核进行独立调试

  • 操作:点击 AS 按钮切换

备注

Run Sync 功能的完整实现通常依赖于 All Stop 机制,二者配合关系如下:

  • 开启 All Stop 时,暂停/继续,单步调试动作会在所有核间同步。

  • 关闭 All Stop 时,各核行为互不强制同步,适合单核排查。

  1. RTOS-Aware

启用 RTOS-Aware 后,调试器能识别操作系统的内部结构。当调试挂起时,调试器将显示出 RTOS 中所有存在的线程。此外,它还允许你查看其他非活动线程的堆栈、寄存器和变量等信息。

多核调试时需要单独控制。在调用堆栈视图中点击 RA 按钮进行切换。

高级调试功能

  1. 实时监视

变量和监视视图需要程序暂停才能刷新,而实时监视允许在程序全速运行时实时观察变量的变化。

  • 监视类型:全局变量或者静态变量。

  • 添加方式:

    • 在 LIVE WATCH 视图中监控变量的值。点击 + 号,输入变量名。

    • 暂停时,变量视图中所有变量都可以通过右键菜单中点击 Add to live watch 添加到实时监控。

    • 在 XPERIPHERALS 视图中所有寄存器都可以通过右键菜单中点击 Add to live watch 添加到实时监控。

备注

需要在调试开始前在配置中配置实时监控的参数。

  1. 外设寄存器

XPERIPHERALS 视图允许查看芯片内部外设寄存器的值。

  • 原理:基于芯片的 SVD( System View Description )文件,解析寄存器地址和位域。

备注

如果未正确配置 SVD 文件路径,此视图将为空。

  1. RTOS 视图

RTOS 内核视图全面展示了由 RTOS 管理的各种内核对象。这些内核对象是嵌入式系统中用于实现任务管理、同步和通信的基础组件。请注意,这些视图仅在调试会话期间可用。

按 F1 然后输入 Open RTOS View 后 选择需要显示的 ROTS 视图

  • RTOS-TASK:

    • 显示所有任务的状态( Running, Ready, Blocked, Suspended )。

    • 显示任务名称、地址、栈使用率/剩余栈空间(用于排查栈溢出)、运行时间、优先级。

  • RTOS-QUEUE:

    • 显示队列的名称、容量、当前消息数、等待该队列的任务列表。

  • RTOS-SOFTWARE TIMER:

    • 显示定时器名称、地址、状态( Active/Inactive,One-shot/Autoreload,Static/Dynamic )、周期、回调函数名称及地址。

  • RTOS-HEAP:

    • 显示动态内存地址范围、分配情况、剩余堆大小、使用率。

  • RTOS-TASK NOTIFICATION:

    • 显示任务名称、地址、已接收和正在等待通知的数量。