一、关于边缘端部署如何使用VSCODE进行本地调试
写在前面:搞AI模型的大部分都是从pycharm或者其他python的IDE入坑的,因此在跑程序的时候用断点调试非常的得心应手。而且断点调试利于追踪数据流也非常的适合用以问题分析。然而在边缘端部署的时候就很难再像使用pycharm一样进行远程的断点调试了。归根结底是因为边缘端不能进行代码编译只能跑应用程序。因此这就引申到了如何在远程端(我常用的是Windows)进行边缘端部署的应用程序的断点调试。
1.1 、准备工作:
在开始之前首先我们要厘清这其中涉及的几个平台:
- Windows(本地):这个主要用来连接远程或者WSL或者虚拟机的编译平台。下文均用PC代替
- Linux(编译平台):这个一般是Ubuntu系统,根据不同人使用不同可能是WSL可能是虚拟机可能是远程编译服务器。这个主要是用来编译代码生成板卡可运行二进制程序。下文均用Linux代替
- Linux(板卡平台):这个是板卡的操作系统,主要是在这里面运行编译好的debug程序以及gdbserver,对我个人而言是使用NPU跑模型程序。下文均用ARM代替
1.1.1、vscode软件及扩展的准备
在开始进行调试之前你要先明确你的板卡端是否能进行GDB调试。这非常重要,如果不能,则需要搜索一下如何离线安装gdb与gdbserver,如果你的板卡完全不支持GDB服务那下面就都不需要去看了。因此本文是基于板卡端存在GDB以及gdbserver的前提进行下去的。关于查看板卡是否支持GDB调试可以通过板卡提供的文档或者连接板卡在命令行输入以下命令查询:
gdb --version ##查看gdb版本
gdbserver --version #查看gdbserver版本
另外还有linux段ssh支持
关于vscode软件
- 下载和安装VSCODE,下载地址:VSCODE
- 在PC打开VSCODE下载“remote-ssh”。
下载了remote ssh后连接到你的linux,具体如何连接可网上搜寻vscode连接远程服务器,教程非常多,此处不赘述了。PC连接上你的linux之后在你的linux端安装 “C/C++”、“GDB Debug”。此处安装扩展也为在扩展:商店搜索不同的在于有一个在XXX中安装,由于我使用的是WSL所以显示的是在WSL中安装
当你安装完这两个插件后你打开扩展会看到如下所示界面,其中本地是你PC的VS code所安装扩展,下面的则是你的linux的VS code扩展。你所要做的就是保证linux安装扩展包括 “C/C++”、“GDB Debug”。
1.1.2、编译程序CMakelist.txt的准备
编译工作绝大部分情况都不是在ARM端进行,而是在linux端进行,但是对应的编译是要使用ARM相对应的交叉编译工具链进行编译。而关于编译通常是使用CMakelist.txt进行,当然也有只需要对某个不需要外部依赖的程序文件进行编译,这种时候以下命令进行:
g++ -g XXX.cpp -o AAA
#XXX是你的代码名字,AAA是你生成的二进制应用程序名字
而如果使用CMakelist.txt文件进行编译则需要在最外部的CMakelist.txt (没尝试过在其他CMakelist中添加,只尝试了最外的) 的开头处添加以下命令:
SET(CMAKE_BUILD_TYPE Debug)
set(CMAKE_C_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g")
至此准备工作大致已经完成。
1.2 、开始进行调试
整体的调试流程图概略如下图所示:
其中PC端是使用vscode连接编译服务器linux,而后linux则通过板卡提供的gdb的交叉编译工具链对板卡使用gdbserver运行的aaa程序进行debug调试。debug的断点是在pc端的vscode去打,其中变量也是在vscode上显示。
1.2.1 、gdbserver
gdbserver服务是运行在arm端的gdb调试服务,其在网络端口下运行命令如下所示:
#注意需要先切到程序aaa所在目录,如果不在则需要在aaa前加上路径
gdbserver zz.zz.zz.zz:8888 aaa
#zz.zz.zz是linux端的IP地址,如果使用wsl则Linux和PC的IP地址一致。端口号8888可以自由设置
#只要确保该端口号未被占用即可。
1.2.2 、Linux端launch.json配置
首先打卡你需要进行调试的代码并打上相应断点
然后按F5会弹出下图所示选项:
选择GDB/LLDB后还有个选项,那个直接选择默认选项即可,选完后会自动生成launch.json文件,内容如下所示
其中"progarm"
是你Linux端编译生成在ARM用来执行debug程序的程序位置(不是代码位置是cmake之后生成的可执行程序位置),"miDebuggerPath"
是Linux端交叉编译工具链位置,寻找可通过which
命令进行寻找。"miDebuggerServerAddress"
是arm上gdbserver监听的IP地址和端口号。
当配置好后直接F5运行即可得到如图所示结果:
至此全部流程完成,享受你的debug过程把。