代码调试
硬件准备
调试适配器:支持 DAP-Link (默认) 或 J-Link
调试目标芯片
连接步骤
将适配器的 SWDIO( SWD )连接到目标芯片的 SWD DATA
将适配器的 SWCLK( CLK )连接到目标芯片的 SWD CLK
将适配器 GND 与目标芯片 GND 连接,确保共地
将适配器通过 USB 连接到 PC
在插件中选择调试目标芯片
参考 插件可选配置 (Debug) 选择调试器类型和配置调试参数
点击 Debug 按钮启动集成的调试器,开始代码调试
备注
RTL8730E KM4 内核调试限制:
调试前需关闭 tickless 功能,否则会影响调试行为。
SWD 引脚差异:
不同芯片/封装的 SWD 引脚位置可能不同,请参考对应 PINMUX 表进行确认。
连接稳定性:
若连接后无法识别目标,优先检查引脚映射是否正确。
若出现连接不稳,可适当降低 SWD 时钟频率。
调试框架
调试框架如下图所示:
目标芯片通过调试适配器与 PC 相连。
启动调试时, OpenOCD( GDB 服务器)启动。你可以在 VS Code 的终端( gdb-server )查看 OpenOCD 输出日志与状态。
工具链内置的 GDB 连接到 OpenOCD ,随后即可进行调试操作。
基础调试技巧
调试工具栏
继续:恢复程序运行(默认快捷键 F5 )。
暂停:暂停当前运行的程序(默认快捷键 F6 )。
逐过程:执行当前行但不进入函数内部(默认快捷键 F10 )。
单步调试:逐语句执行并进入函数内部(默认快捷键 F11 )。
单步跳出:从当前函数返回到上层(默认快捷键 Shift+F11 )。
变量
这是调试时最常用的视图,它会显示当前程序停止位置可见的所有数据。系统会自动分类:
Local: 当前函数作用域内的局部变量。
Global: 全局变量。
Static: 当前文件内的静态变量。
Registers: 当前 CPU 核的寄存器值。
断点
断点是调试过程中最常用的工具。当程序运行到断点位置时会自动暂停,允许您检查当前的变量状态或寄存器信息。
断点方式 |
断点管理 |
|---|---|
行号点击 |
添加:在编辑器中,直接点击代码行号左侧的空白区域(点击后会出现红点) 查看:左侧的 断点 面板,这里列出了所有断点的位置 删除:再次点击行号左侧的红点,即可取消该断点 |
右键菜单 |
添加:在代码区域点击鼠标右键,选择 Add Hardware Breakpoint 查看:左侧的 断点 面板,这里列出了所有断点的位置 删除:左侧的 断点 面板,选择相应断点删除 |
调试控制台 |
添加:程序暂停时,在调试控制台输入 GDB 命令
查看: info breakpints 或 info b
|
备注
不同的芯片架构对硬件断点的数量有限制,超过限制的断点将被视为无效。
观察点
观察点监视内存地址或变量的变化,当值被读取、写入或修改时中断程序。
观察点方式 |
观察点管理 |
|---|---|
右键菜单 |
添加:程序暂停时,
查看:左侧的 断点 面板,这里列出了所有观察点 删除:左侧的 断点 面板,选择相应观察点删除 |
调试控制台 |
添加:程序暂停时,在调试控制台输入 GDB 命令
查看: info watch 或 info watchpoints
|
备注
不同的芯片架构对观察点的数量有限制,超过限制的观察点将被视为无效。
监视
监视面板允许你监控你关注的变量。通过以下方式监控:
查看变量:
在代码中右键点击变量 添加到监视。
程序暂停时,在变量面板,右键点击目标变量 添加到监视。
在监视面板中点击 + 号输入变量名。
查看任意内存地址:
直接输入地址转换表达式,例如*(int*)0x20000004 ,即可查看该地址的数值。
内存视图:按 F1 输入 MemoryView 打开专用面板,支持查看大块内存区域的 Hex 数据。
强制类型转换:
支持 C 语言风格的转换,例如 (char*)my_var 以查看字符串的值。
调用堆栈
当代码逻辑复杂时,调用堆栈能清晰展示 程序执行路径。
层级导航:顶层为当前暂停行,第二层为调用者(父函数),依此类推。点击不同层级可跳转查看当时的上下文变量。
多核调试控制
启动多核调试后,调用堆栈视图将列出所有核的调试会话。用户可通过点击视图标题栏上的按钮,在以下两种协作模式间进行切换。
模式 |
说明 |
|---|---|
Run Sync |
|
All Stop |
|
备注
Run Sync 功能的完整实现通常依赖于 All Stop 机制,二者配合关系如下:
开启 All Stop 时,暂停/继续,单步调试动作会在所有核间同步。
关闭 All Stop 时,各核行为互不强制同步,适合单核排查。
RTOS-Aware
启用 RTOS-Aware 后,调试器能识别操作系统的内部结构。当调试挂起时,调试器将显示出 RTOS 中所有存在的线程。此外,它还允许你查看其他非活动线程的堆栈、寄存器和变量等信息。
多核调试时需要单独控制。在调用堆栈视图中点击 RA 按钮进行切换。
高级调试功能
实时监视
变量和监视视图需要程序暂停才能刷新,而实时监视允许在程序全速运行时实时观察变量的变化。
监视类型:全局变量或者静态变量。
添加方式:
在 LIVE WATCH 视图中监控变量的值。点击 + 号,输入变量名。
暂停时,变量视图中所有变量都可以通过右键菜单中点击 Add to live watch 添加到实时监控。
在 XPERIPHERALS 视图中所有寄存器都可以通过右键菜单中点击 Add to live watch 添加到实时监控。
备注
需要在调试开始前在配置中配置实时监控的参数。
外设寄存器
XPERIPHERALS 视图允许查看芯片内部外设寄存器的值。
原理:基于芯片的 SVD( System View Description )文件,解析寄存器地址和位域。
备注
如果未正确配置 SVD 文件路径,此视图将为空。
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:
显示任务名称、地址、已接收和正在等待通知的数量。