VSCode下 搭建 ARM Cortex-M 开发环境 -- Part 2 调试环境搭建

  • Part 0 开发工具安装
  • Part 1 编译环境搭建
  • Part 2 调试环境搭建

VSCode下 搭建 ARM Cortex-M 开发环境 -- Part 2 调试环境搭建

前言

本章旨在记录如何在VSCode搭建DEBUG环境,具体包含以下几个部分:

  1. 调试所需基础环境
  2. 运行OpenOCD
  3. 在VSCode下创建task运行OpenOCD(可选)
  4. 在VSCode下创建task编译工程(可选)
  5. 在VSCode下添加GDB配置
  6. 在VSCode下使用GDB调试程序

调试所需基础环境

  • 程序是如何被调试的?
    如下图所示,使用GDB调试目标系统需要满足以下条件:
    gdb-with-gdb-server.png
    1. PC端得运行GDB程序
      GDB程序可以在Termianl中运行,也可以在IDE中运行GDB。GDB程序运行以后,用户可以通过下GDB command去调试目标系统
    2. PC端还得运行GDB Server
      GDB Server起到承上启下的作用:
      1)通过TCP/IP Port与GDB程序通信,GDB Server接受来自GDB的命令
      2)GDB Server 通过USB控制Debugger,让Debugger执行GDB命令对应的动作
    3. 连接Debugger
      Debugger收到GDB的命令,通过JTAG去Access CPU的Debug uint
    4. CPU的Debug uint
      CPU中的Debug uint实现各种Debug event, 例如Instruction Breakpiont, Data Breakpoint,单步执行等
  • VSCode下debug架构
    VSCode下debug架构与上图中各个组件一一对应的话:
    • VSCode 对应着 IDE
    • GDB 对应着 arm-none-eabi-gdb
    • GDB Server 对应着 OpenOCD
    • Debug Probe 对应着 ST-Link
    • Microcontroller 对应着 STM32F429 chip

运行OpenOCD

运行OpenOCD是为了 在PC上有GDB server在运行。 有了GDB Server,arm-none-eabi-gdb才能够控制ST-Link

  1. 在Project的tools文件夹下创建openocd_settings文件夹
    创建openocd_settings文件夹.png
  2. 复制{OpenOCD PATH}\openocd-0.10.0\tcl 下的 mem_helper.tcl{Project PATH}\tools\openocd_settings
    mem_helper.tcl.png

    {Project PATH}\tools\openocd_settings下mem_helper.tcl.png
  3. 复制{OpenOCD PATH}\openocd-0.10.0\tcl\target 下的 swj-dp.tcl{Project PATH}\tools\openocd_settings
    swj-dp.tcl.png

    {Project PATH}\tools\openocd_settings\swj-dp.tcl.png
  4. 复制{OpenOCD PATH}\openocd-0.10.0\tcl\interface 下的 stlink-v2-1.cfg{Project PATH}\tools\openocd_settings
    stlink-v2-1.cfg.png

    tools\openocd_settings\stlink-v2-1.cfg.png
  5. 复制{OpenOCD PATH}\openocd-0.10.0\tcl\target 下的 stm32f4x.cfg{Project PATH}\tools\openocd_settings
    stm32f4x.cfg.png

    tools\openocd_settings\stm32f4x.cfg.png
  6. 按照下图修改{Project PATH}\tools\openocd_settings\stm32f4x.cfg
    source [find target/swj-dp.tcl] 替换为 source [find tools/openocd_settings/swj-dp.tcl]
    source [find mem_helper.tcl] 替换为 source [find tools/openocd_settings/mem_helper.tcl]
    修改stm32f4x.cfg.png
  7. 把开发板连上电脑,在VSCode的Terminal下执行如下命令, 即可发现openocd已经成功connect上ST-link了
openocd -f tools/openocd_settings/stlink-v2-1.cfg -f tools/openocd_settings/stm32f4x.cfg

openocd connect ST-link.png

至此,openocd已经成功运行,并且可以成功connect上ST-Link了

在VSCode下创建task运行OpenOCD

在每次debug之前首先得让openocd成功运行并且connect上板子。但是,每次都要在Termianl输入command实在太麻烦了,不如在创建个VSCode Task帮我们做这事:

  1. 在VSCode界面下,单击“任务”,选择“配置任务”
  2. 在task.json下 创建一个名为 "openocd" 的 task, 代码如下:
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "openocd",
            "type": "shell",
            "command": "openocd -f tools/openocd_settings/stlink-v2-1.cfg -f tools/openocd_settings/stm32f4x.cfg",
        }
    ],
}
  1. 按F1 显示命令, 输入 “Tasks: Run Task”,然后回车,选择“openocd”,然后一路回车。即可让VSCode 创建一个task去 运行openocd连接ST-Link了


    运行openocd task.png

在VSCode下创建task编译工程(可选)

在每次debug之前可能需要重新编译程序。但是,每次都要在Termianl输入make clean 和 make 实在太麻烦了,不如在创建个VSCode Task帮我们做这事:

  1. 在tools文件夹下创建build.py
import subprocess
import os

if __name__ == '__main__':
    # subprocess.run(["pwd"])
    subprocess.run(["echo", "building...."])
    subprocess.run(["make", "clean"])
    subprocess.run(["make"])
build.py.png
  1. 在VSCode界面下,单击“任务”,选择“配置任务”
  2. 在task.json下 创建一个名为 "build" 的 task, 代码如下:
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "openocd",
            "type": "shell",
            "command": "openocd -f tools/openocd_settings/stlink-v2-1.cfg -f tools/openocd_settings/stm32f4x.cfg",
        },
        {
            "label": "build",
            "type": "shell",
            "command": "python",
            "args": [
                "tools/build.py"
            ]            
        }
    ],
}
  1. 按F1 显示命令, 输入 “Tasks: Run Task”,然后回车,选择“build”,然后一路回车。即可让VSCode 创建一个task去 编译程序了


    运行build task.png

在VSCode下添加GDB配置

  1. 在VSCode界面下,单击“调试”,选择“添加配置”
  2. 在launch.json 添加 如下ARM Debug配置
{
    "version": "0.2.0",
    "configurations": [
        
        {
            "name": "ARM Debug",
            "type": "cppdbg",
            "request": "launch",
            "miDebuggerPath": "E:\\ARM\\gcc-arm-none-eabi\\bin\\arm-none-eabi-gdb.exe",
            "targetArchitecture": "arm",
            "program": "${workspaceRoot}\\out\\HAL_demo.elf",
            "setupCommands": [
                {
                    "text": "file 'E:/STMicroelectronics/workspace/stm32f429/projects/HAL_demo/out/HAL_demo.elf'"
                },
                {
                    "text": "target remote localhost:3333"
                },
                {
                    "text": "monitor reset"
                },
                {
                    "text": "monitor halt"
                },
                {
                    "text": "load"
                }
            ],
            "preLaunchTask": "build",
            "launchCompleteCommand": "None",
            "externalConsole": true,
            "cwd": "${workspaceRoot}"
        }
    ]
}

注意事项:

  • "miDebuggerPath": "E:\ARM\gcc-arm-none-eabi\bin\arm-none-eabi-gdb.exe" 替换为 您本地的 arm-none-eabi-gdb.exe路径
  • "program": "${workspaceRoot}\out\HAL_demo.elf" 替换为 您Project的elf文件名称和路径
  • "file 'E:/STMicroelectronics/workspace/stm32f429/projects/HAL_demo/out/HAL_demo.elf'" 替换为 您Project的elf文件名称和路径
  • ARM Debug配置中有设置 preLaunchTask 为 “build”(必须与前面创建的build task同名)。这样做的目的是为了: 每次debug时都会重新Build Project。如果每次Debug时不需要重新Build Project, mask掉这行即可

在VSCode下使用GDB调试程序

上面步骤完成以后,我们可以正式开始调试前一章节编译出来的可执行文件了。

  • 运行"openocd" task, 确保openocd成功运行并且连接上ST-Link
    运行"openocd" task.png
  • 按下F5进入到VSCode Debug界面
    进入Debug界面.png
  • 在程序某处打上断点,然后按F5继续,可以发现程序已经运行到断点处
    打断点.png
  • 在调试控制台 输入如下command 查看 core registers状况
-exec info registers
查看 core registers状况.png
  • 在调试控制台 输入如下command 查看 PC位置和汇编Code
-exec disassemble
查看PC位置和汇编Code.png
  • 继续运行,按F6暂停,查看当前CPU状况
    查看当前CPU状况.png

    可以发现当前程序运行到prvCheckTasksWaitingTermination function里面
  • 其他功能
    单步调试,重启,查看变量,调用堆栈 等功能都是可以工作的。大家自己尝试一下。
    Note: 单步调试,单步跳过,单步跳出这些功能是C Code为单位的,不是以ASM Code为单位的

本章总结

至此,我们已经成功在VSCode下搭建调试环境了,可以愉快使用GDB调试板子了。
可惜,目前在VSCode调试还有以下缺陷(这些缺陷通过GDB command可以解决)

  1. 不支持汇编程序调试
  2. 查看Registers状况不方便
  3. 创建data breakpoint 不方便
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容