VSCode + GDB + J-Link 单片机程序调试实践
本文介绍如何创建VSCode的调试配置,如何控制调试过程,如何查看修改各种变量。
安装调试插件
- 在 VSCode 扩展窗口搜索安装 Cortex-Debug插件
创建调试配置
- 在 Run and Debug 窗口点击 create a launch.json file ,弹出窗口选择 Cortex Debug 。将创建一个默认的配置文件。
修改默认配置
- 修改 executable 字段,填入待调试的程序文件名,注意:必须是 elf 格式,不是 hex 或 bin 。
- 修改 device 字段,填入 MCU 型号。
- 可选修改 name 字段,填入易理解的名称,这是区分不同调试配置的名称。
- 可选添加 svdPath 字段,如果需要查看外设寄存器。
启动调试
-
完成配置后, Run and Debug 窗口将显示调试配置名称,点击绿色三角形 StartDebugging 按钮启动调试,如下图所示。
-
启动调试后,将在窗口上方显示调试工具栏,如下图所示。
调试工具栏
-
第一个按钮为 Reset device 。复位 MCU ,重新从 main 开始执行。
-
第二个按钮为 Continue ,连续执行,即 Run 操作。连续执行期间,该按钮将变成 Pause 按钮,点击Pause 按钮将暂停 CPU 的执行,即Halt 操作。
-
Step Over 按钮,单步执行,碰到函数,将函数作为一个步骤执行。
-
若当前焦点在源代码窗口,则执行语句单步。
-
若当前焦点在反汇编窗口,则执行指令单步。
-
Step Into 按钮,单步执行,碰到函数则进入函数。
-
若当前焦点在源代码窗口,则执行语句单步。
-
若当前焦点在反汇编窗口,则执行指令单步。
-
Step Out ,执行完当前函数剩余语句并返回调用处后暂停。即 Return操作。
-
Restart ,重新开始,复位MCU ,重新从 main 开始执行。与 Reset device 按钮等效。
-
但是,点击过 Restart 按钮后,结束调试时,调试工具栏不会消失,因此推荐使用 Reset device按钮。
-
Stop ,结束调试。
添加断点
-
在源代码窗口行号左侧点击添加断点。
-
在 BREAKPOINTS 窗口点击加号图标添加函数断点。
查看调用栈
- CALL STACK 窗口查看当前调用栈,下方函数调用上方函数。
查看局部变量和 CPU 寄存器
- 在 VARIABLES 窗口的 Local 分类下查看函数局部变量。
- 在 VARIABLES 窗口的 Registers 分类下查看 CPU 寄存器。
- VARIABLES 窗口还可以查看全部全局变量和当前源文件的静态变量,这里列出的变量太多了,不利查看,要查看全局变量可以将全局变量添加到 WATCH窗口。
查看全局变量
-
选中全局变量,弹出右键菜单,选择 Add to Watch ,将全局变量添加到 WATCH 窗口。
-
也可以在 WATCH 窗口点击加号按钮添加全局变量到 WATCH 窗口。
查看外设寄存器
- XPERIPHERALS 窗口查看外设寄存器。
- 若未在调试配置中指定 svdPath ,那么外设寄存器窗口将不可见。
查看反汇编
- 在 CPU 被 halt 的状态下,在源代码窗口点击右键选择Open Disassembly View 打开反汇编窗口。
- 可以拖动反汇编窗口,使其与源代码窗口并排,以便对照。
- 单步执行时,若焦点在源代码窗口,那么执行语句单步,若焦点在反汇编窗口,那么执行指令单步。
在线监视变量
- 若在调试配置中设置了liveWatch 字段,将支持 Live Watch ,即在线监视变量。
- 添加到 CORTEX LIVEWATCH 窗口中的变量在CPU 执行期间将定时读取其数值,并在窗口内显示。
- 其它方式查看变量值时需要将CPU 停下,而 Live Watch 可以在不暂停 CPU 执行的情况下定时更新变量值。
查看操作系统任务列表
- Cortex-Debug 插件包含 XRTOS 窗口,可以自动检测程序是否使用了操作系统,并可以查看所支持的操作系统任务列表,如下图所示, XRTOS 检测到当前程序使用了 uC/OS-II ,并列出了所有任务,包括任务优先级、任务名称、堆栈使用情况。
添加 Watchpoint
-
VSCode 图形界面未找到添加Watchpoint 的入口。
-
可以通过调试器命令行窗口输入调试命令的方式添加Watchpoint 。
-
在 DEBUG CONSOLE 窗口输入 watch OSRunning 添加Watchpoint 监视 OSRunning被修改的位置。
-
DEBUG CONSOLE 输入 info break 可以查看添加的Watchpoint 。