轻量鸿蒙开发方案中,使用GDB JLink进行STM32应用调试的方案

背景

该文档适用于openHarmony3.2/openHarmony4.0版本,其他版本也可做参考。由于OpenHarmony的编译工作都改在了ubuntu下,而stm32开发属于鸿蒙标准、小型、轻量三个等级中的轻量级,也脱离不了要在ubuntu上完成全套的开发、编译、调试工作。
之前stm32在windows下可以借助keil软件,方便地实现开发、编译、调试一体化工作。而开发工作转移到ubuntu上后,传统的开发方式尤其是调试方式发生比较大的改变。而鸿蒙官方也未在文档上针对轻量级鸿蒙stm32的调试做出明确的指导。下面是我结合自己对vscode工具、gdb调试工具和jilnk工具的了解,探索出来的一种可行的调试方法。

思路

在嵌入式linux调试中,一般在arm目标板上运行GDB Server,开启调试使用的ip:端口远程服务,在ubuntu电脑桌面端运行交叉编译工具的GDB客户端,指定arm目标板上的ip:端口进行连接,完成代码调试。

在针对stm32进行调试,使用jlink工具,也可以得到标准的GDB Server,开启调试使用的ip:端口远程服务。因此在ubuntu电脑桌面端就变成了常规的嵌入式linux调试(使用ubuntu vscode工具完成可视化调试)。整个数据交互思路如下图所示。

在windows上使用Jlink完成GDB Server服务的开启

在JLink的安装目录下,打开JLinkGDBServer.exe软件。

打开软件后的界面如下图所示

选择USB,选择正确的Target device,根据实际选择Target interface,取消勾选Localhost only(因为代码是在桌面ubuntu端,不是在本地windows上,需要在局域网内通信)。然后点击OK。

正常运行的情况如下图所示,J-Link状态为Connected,已连上板子;GDB状态为Waiting for connection,等待GDB客户端连接;观察输出日志得到端口号为2331,确保Accept remote connection为yes,这样才能实现局域网连接。

在ubuntu上使用交叉编译工具链中gdb软件进行连接

使用DevEco Device Tool工具进行安装交叉编译工具链,用于arm芯片交叉编译工具一般路径在~/.deveco-device-tool/resources/compilers/gcc-arm-none-eabi/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10/bin目录下。如下图。

为方便使用,可以将该目录加入PATH环境变量

export PATH=/home/xiaoy/.deveco-device-tool/resources/compilers/gcc-arm-none-eabi/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10/bin/:$PATH

查看鸿蒙编译出来的应用,这里是OHOS_Image,没有后缀,而在window使用keil软件编译出来上其一般带.elf后端,都是可执行软件的意思。

gdb调试应用,还需要在编译时加上-g。由于鸿蒙使用的是Ninja、GN工具来管理项目文件,这里我在应用的BUILD.gn中cflags加入-g,然后重新编译程序。

应用程序编译完成后,执行下面命令开始调试

arm-none-eabi-gdb OHOS_Image

输出如下图信息,注意观察,只有编译时成功加上-g参数才有“Reading symbols from OHOS_Image…”的输出

接着输入下面命令进行连接,ip改为实际的gdb server ip(即windows电脑ip),端口可以从JLinkGDBServer.exe启动后输出的日志信息获得。

target remote 192.168.52.167:2331

连接成功,windows电脑上的JLinkGDBServer.exe会如下图所示有一个客户端已连接上。

ubuntu上输出内容如下图(仅供参考,内容不一定相同,只要没有明显报错就行),输入l 还可以查看代码。

使用下面命令,可以通过GDB烧写程序。至此,说明GDB调试已经跑通,下面使用VScode工具,进行图形化配置,更方便地进行调试操作。

monitor reset #复位MCU,从而让MCU处于确定的状态

monitor halt  #挂起,挂起程序后,才能烧写flash

load OHOS_Image #烧写flash

使用ubuntu上的vscode工具进行图形化调试操作

使用vscode打开openHarmony工程,打开.vscode/lauch.json文件,可以看到如下图的信息。

切换到调试页面,可以看到调试选项都是由lauch.json文件配置生成,其中已经有华为DevEco Device Tool工具自动生成的一些调试配置,但由于配置不全等原因,不能直接进行使用。

也在该配置文件中新增一条自己自定义的配置信息,本质上是借用vscode的c++插件调用gdb来实现调试功能。新增配置如下

{
            "name": "gdb_test_board",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/out/test_board/test_board/OHOS_Image",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}/out/test_board/test_board/",
            "miDebuggerPath": "/home/xiaoy/.deveco-device-tool/resources/compilers/gcc-arm-none-eabi/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gdb",
            "targetArchitecture": "arm",

            "setupCommands": [                                                      // 进入GDB以后,自动执行的一些配置  
            {
                 "description": "选择调试文件(.elf)到gdb",
                 "text": "file ${workspaceFolder}/out/test_board/test_board/OHOS_Image", 
                 "ignoreFailures": false
             },
             {
                 "description": "连接GDB Server",
                 "text": "target remote 192.168.52.167:2331",                                 
                 "ignoreFailures": false
             },
             {
                 "description": "Reset MCU",
                 "text": "monitor reset",                                              
                 "ignoreFailures": false
             },
             {
                 "description": "Halt",
                 "text": "monitor halt",                                                  
                 "ignoreFailures": false
             },
             {
                 "description":"下载代码到MCU",
                 "text": "load" ,              
                 "ignoreFailures": false                                      
             }
         ],
        }

**注意:**若配置中"type": "cppdbg"有波浪线,说明有插件未安装好,参考本文档下面《错误:Configured debug type ‘cppdbg’ is not supported 》进行解决。

正常配置后,如下图,选择gdb_test_board选项,然后点击绿色运行图标,运行调试。

我在main函数中打了断点,程序停在了这里。具体调试操作参考常规GUI软件的调试方法,大致相同。

错误:Configured debug type ‘cppdbg’ is not supported

解决:该问题是c++调试方面的插件没有安装/开启导致,安装如下插件,并确保插件启用。

**注:**启用该插件有可能导致程序编译过慢(该插件会分析工程中C++代码的语法,由于鸿蒙工程过大,无法一下子分析完成,会一直在后台占用资源,详细可在终端使用top命令,观察是否有cpptools进行在后台占用比较多的资源)

参考链接:

用gdb调试Cortex-M系列芯片 | Simple (cedar-renjun.github.io)

用VS Code开发STM32(三)——调试 – 知乎 (zhihu.com)

作者:步行者จุ๊บ

物联沃分享整理
物联沃-IOTWORD物联网 » 轻量鸿蒙开发方案中,使用GDB JLink进行STM32应用调试的方案

发表评论