如何使用VSCode+gdbserver远程调试ZMC900E
bigegpt 2025-07-08 16:40 1 浏览
由于嵌入式设备资源受限,通常无法在其上安装庞大的IDE调试程序,且许多嵌入式系统并无桌面环境。为了方便调试自开发程序,本文介绍利用VSCode与gdbserver进行嵌入式设备上程序的远程调试方法。
前言
嵌入式Linux系统,由于系统资源的匮乏,通常无法安装本地编译器进行本地开发,而需要在借助一台主机进行交叉开发。一般情况下,在主机安装相应的交叉编译器,将在主机编辑好的程序交叉编译后,通过一定方式如以太网或者串口将程序下载到目标系统运行,或者进行调试。一般的交叉开发流程如图1所示。关于Windows上搭建交叉编译环境,可以参考《不借助Linux系统,在Windows下如何搭建ZMC900E交叉编译环境》。
图1 嵌入式Linux交叉开发一般流程
由于系统资源限制,通常在ZMC600E/900E上无法安装庞大的IDE来调试程序,同时ZMC600E/900E中默认不带桌面。我们可以通过VSCode+ssh协议远程到ZMC600E/900E来开发和运行程序,但通常只能在设备上通过gdb命令行程序进行调试。为了更加方便地调试程序,可以通过VSCode+gdbserver程序来实现远程调试的目的。接下来将详细介绍如何在Windows上实现远程调试ZMC600E/900E。
测试环境
1. 远程设备:ZMC900E主站控制器
2. 主机:Win10
3. IDE: VS Code
4. 所需软件环境:
- cmake版本3.xx,推荐3.20及以上版本,下载路径:
- https://cmake.org/download/
- mingw64(主要需要mingw32-make.exe)获取最新版本,下载路径:
- https://github.com/skeeto/w64devkit/releases
- aarch64-linux-gnu(windows)交叉编译链,包括:
- ① 编译器aarch64-linux-gnu-gcc.exe aarch64-linux-gnu-g++.exe等;
- ② aarch64-linux-gnu.cmake 交叉编译工具链配置文件;
- ③ 调试器aarch64-linux-gnu-gdb.exe gdbserver(arm Linux程序);
- ④ 可以联系我们技术支持获取。
5. VSCode需要的插件:
- C/C++
- C/C++ Extension Pack
- CMake
- CMake Integration
- CMake Tools
- GDB Debug
- Remote - SSH
- Remote development
图2 VSCode中需要的插件
6. 环境变量:
- 将交叉编译链解压到D:/aarch64-linux-gnu(或其他容易找到的地方),将D:/aarch64-linux-gnu/bin 加入环境变量。
- 将CMake和mingw64也加入到环境变量。
- 重启使其生效。
图3 Windows环境变量配置
7. OpenSSL
对win10及更新版本的Windows系统,已默认包含在系统软件中。旧版本Windows需要自行安装。
基本步骤
1. Windows下交叉编译链的搭建,并尝试编译程序进行验证;
2. 在VSCode上搭建图形化编译环境;
3. 搭建远程gdbserver和本地gdb联调。
前两步可以参考《不借助Linux系统,在Windows下如何搭建ZMC900E交叉编译环境》。
远程GDB调试
远程调试的基本逻辑是:
- 将程序、动态库、gdbserver以及ENI文件上传远程ZMC900E设备上,同时在本地需要保留一份一样的程序用于调试;
- 在远程ZMC900E上启动gdbserver,在本地程序启动aarch64-linux-gnu-gdb.exe程序远程连接到服务器。
1. 修改CMakeLists.txt为Debug模式
打开CMakeLists.txt,输入以下内容。
cmake_minimum_required(VERSION 3.10)project(test)set(CMAKE_BUILD_TYPE Debug)add_definitions(-Wall -ggdb -O0 -pipe)include_directories("../../include")link_directories("../../lib")add_executable(test test.c)target_link_options(test PRIVATE -lpthread -lrt -ldl -lstdc++ -lm)target_link_libraries(test zecm)
其中新增了以下内容:
- set(CMAKE_BUILD_TYPE Debug)配置编译类型为debug模式;
- add_definitions(-Wall -ggdb -O0 -pipe)增加编译参数,-Wall开启所有编译警告与提示,指定调试器为gdb,并-O0关闭所有编译优化。
注意:set(CMAKE_BUILD_TYPE Debug) add_definitions(-Wall -ggdb -O0 -pipe)
这两行为debug必需,且不能开-O优化,必须写-O零,否则调试信息会不完整并错乱,断点或单步调试会错位。
2. 配置本地VSCode的gdb
在侧边栏点Debug,打开下拉栏,点Add Configure,生成新的配置文件。或点击“create a new launch.json file”。将以下配置复制进去并作相应修改,保存。
图4 配置launch.json
图5 配置launch.json 2
在launch.json中写入以下内容。
{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [ { "name": "g++", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/build/${fileBasenameNoExtension}", "args": [ "test.xml" ], "cwd": "${workspaceFolder}", "stopAtEntry": false, "externalConsole": false, "useExtendedRemote": true, "MIMode": "gdb", "targetArchitecture": "arm", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true }, { "description": "set up remote debug program", "text": "set remote exec-file ${fileBasenameNoExtension}", "ignoreFailures": false }, ], "miDebuggerPath": "D:/aarch64-linux/bin/aarch64-linux-gnu-gdb.exe", // "miDebuggerPath": "/usr/bin/gdb-multiarch", "miDebuggerServerAddress": "192.168.1.136:2000" } ]}
这个文件很重要,远程gdb调试的配置项大多都在这个文件中。下面会对文件中的每个需要配置的选项进行说明:
2.1 "program": "${workspaceFolder}/build/${fileBasenameNoExtension}",此选项要指向放在本地的要执行的程序。例如可以写成${workspaceFolder}/build/hello。fileBasenameNoExtension的意思是,如果当前主界面打开hello.c源文件,则fileBasenameNoExtension == hello,将启动同名程序调试,根据实际情况替换为实际程序名或保留。
2.2 "args": ["test.xml"],传给程序的命令行参数。注意调试EtherCAT的时候,命令行参数ENI文件名从此项配置传入,但是ENI文件必须先上传到ZMC900E,与gdbserver和调试程序放在同一路径下。
2.3
{"description": "set up remote debug program","text": "set remote exec-file ${fileBasenameNoExtension}","ignoreFailures": false}
项设置配合gdbserver --multi COM使用,可以避免频繁重启gdbserver,${fileBasenameNoExtension}同样根据实际情况替换为实际程序名或保留。
2.4 "miDebuggerPath": "
D:/aarch64-linux/bin/aarch64-linux-gnu-gdb.exe",指向本地gdb,推荐使用绝对路径,这里指向的是交叉编译链里的gdb。
2.5 "miDebuggerServerAddress": "192.168.1.136:2000" ,远程gdbserver开启时绑定的接口。
3. 启动ZMC900E上的远程gdbserver
ssh远程登录到ZMC900E,把gdbserver传到ZMC900E并放在和待执行程序同一路径下,切换到工作路径,运行。
# ZMC900E./gdbserver --multi 192.168.1.136:200
此处参数—multi(两条杠)可以避免频繁启动gdbserver,使其开启后可以反复远程连接。192.168.1.136为与电脑连接的网口的IP地址,net1默认为192.168.1.136。端口号选择一个不会和其他程序冲突的端口,例如2000。
4. VSCode连接远程gdbserver,开始调试
在VSCode中,打开源代码,在gdb调试页中选择刚刚配置的调试选项,按F5,等待其连接并运行。
图6 启动远程调试
可以看到程序成功运行且断点有效,并且变量列表里也可以实时获取变量的值,可进行单步调试,与本地程序调试无异。
5. VSCode Debug调试界面介绍
首先介绍工具栏。启动调试后,会在代码编辑界面上方浮动一个工具栏。该工具栏的功能从左到右为:继续运行、按行/步骤运行、按步运行、运行直到当前调用栈退出、重新启动程序和停止调试。
图7 调试工具栏
左侧从上往下进行介绍。VARIABLES是变量窗口,可以查看局部变量和全局变量的值,还可以在调试中手动修改值进行测试。WATCH是监视窗口,可以将变量或表达式添加进去进行持续查看。CALL STACK是程序当前的调用栈情况。BREAKPOINTS是当前调试的断点情况。
图8 调试变量、监测、调用栈和断点等窗口
下方log会打印VSCode gdb插件的一些日志信息。
图9 VSCode gdb插件日志
在ZMC900E上,gdbserver也会打印一些日志。
图10 gdbserver日志
注意事项
gdbserver开启后由于捕捉了SIGNT信号,即ctrl+C信号,无法用命令行直接退出。如果要退出gdbserver可以另外开一个终端,用ps -A查看pid,然后kill -9 pid。
ZMC900E高性能EtherCAT主站控制器
图11 ZMC900E高性能EtherCAT主站控制器
ZMC900E 是ZLG致远电子开发的最新一代EtherCAT主站控制器,其核心采用多核异构的应用处理器,内核包括4+1个64位的Arm(R)Cortex(R)-A55核,主频2GHz;3个Cortex-R5F内核,主频800MHz。同时板载4GB LPDDR4、8GB eMMC以及32KB FRAM。
ZMC900E EtherCAT主站控制器为了满足不同的自动化应用需求,集成1路专用EtherCAT口、3路通用以太网、1路CANFD、1路RS485、1路TF卡、1路USB3.0 Host、1路HDMI接口、16路Dl数字输入、16路DO数字输出等接口,灵活满足自动化设备应用需求。
ZMC900E 示意图及接口图如下所示:
图12 ZMC900E接口
相关推荐
- 恢复软件6款汇总推荐,帮你减轻数据恢复压力!
-
在当今数字化生活中,数据丢失的风险如影随形。无论是误删文件、硬盘故障,还是遭遇病毒攻击,丢失的数据都可能给我们带来不小的麻烦。此时,一款优秀的数据恢复软件就成为了挽救数据的关键。今天,为大家汇总推荐...
- 中兴星星一号刷回官方原版recovery的教程
-
【搞科技教程】中兴星星一号的官方recovery也来说一下了,因为之前给大家分享过了第三方的recovery了,之前给大家分享的第三方recovery也是采用一键刷入的方式,如果细心的朋友会发现,之前...
- 新玩机工具箱,Uotan柚坛工具箱软件体验
-
以前的手机系统功能比较单调,各厂商的重视程度不一样,所以喜欢玩机的朋友会解锁手机系统的读写权限,来进行刷机或者ROOT之类的操作,让使用体验更好。随着现在的手机系统越来越保守,以及自身功能的增强,...
- 三星g906k刷recovery教程_三星g906k中文recovery下载
-
【搞科技教程】看到有一些机友在找三星g906k的第三方recovery,下面就来说一下详细的recovery的刷入方法了,因为手机只有有了第三方的recovery之后才可以刷第三方的root包和系统包...
- 中兴星星2号刷recovery教程_星星二号中文recovery下载
-
【搞科技教程】咱们的中兴星星2手机也就是中兴星星二号手机的第三方recovery已经出来了,并且是中文版的,有了这个recovery之后,咱们的手机就可以轻松的刷第三方的系统包了,如果没有第三方的re...
- 数据恢复软件有哪些值得推荐?这 6 款亲测好用的工具汇总请收好!
-
在数字生活中,数据丢失的阴霾常常突如其来。无论是误删工作文档、格式化重要磁盘,还是遭遇系统崩溃,都可能让我们陷入焦虑。关键时刻,一款得力的数据恢复软件便是那根“救命稻草”。今天,为大家精心汇总6...
- 中兴u956刷入recovery的教程(中兴e5900刷机)
-
【搞科技教程】这次主要来给大家说说中兴u956手机如何刷入第三方的recovery,因为第三方的recovery工具是咱们刷第三方rom包的基础,可是很我欠却不会刷,所以太这里来给大家整理了一下详细的...
- 联想A850+刷recovery教程 联想A850+第三方recovery下载
-
【搞科技教程】联想A850+的第三方recovery出来了,这个第三方的recovery是非常的重要的,比如咱们的手机要刷第三方的系统包的时候,都是需要用到这个第三方的recovery的,在网上也是有...
- 工具侠重大更新 智能机上刷机一条龙完成
-
工具侠是针对玩机的机油开发的一款工具,不管是发烧级别的粉丝,还是普通小白用户,都可以在工具侠上找到你喜欢的工具应用。这不,最新的工具侠2.0.16版本,更新了专门为小白准备的刷机助手工具,以及MTK超...
- shift+delete删除的文件找回6种硬盘数据恢复工具
-
硬盘作为电脑的重要存储设备,如同一个巨大的数字仓库,承载着我们日常工作、学习和生活中的各种文件,从珍贵的照片、重要的工作文档到喜爱的视频、音乐等,都依赖硬盘来安全存放。但有时,我们可能会不小心用sh...
- 使用vscode+Deepseek 实现AI编程 基于Cline和continue
-
尊敬的诸位!我是一名专注于嵌入式开发的物联网工程师。关注我,持续分享最新物联网与AI资讯和开发实战。期望与您携手探寻物联网与AI的无尽可能。这两天deepseek3.0上线,据说编程能力比肩Cl...
- 详解如何使用VSCode搭建TypeScript环境(适合小白)
-
搭建Javascript环境因为TypeScript不能直接在浏览器上运行。它需要编译器来编译并生成JavaScript文件。所以需要首先安装好javascript环境,可以参考文章:https://...
- 使用VSCode来书写你的Jupyter Notebooks
-
现在你可以在VScode里面来书写你的notebook了,使用起来十分的方便。下面来给大家演示一下环境的搭建。首先需要安装一个jupyter的包,使用下面的命令安装:pip3install-ih...
- 使用VSCode模板提高Vue开发效率(vscode开发vue插件)
-
安装VSCode安装Vetur和VueHelper插件,安装完成后需要重启VScode。在扩展插件搜索框中找到如下Vetur和VueHelper两个插件,注意看图标。添加Vue模板打...
- 干货!VsCode接入DeepSeek实现AI编程的5种主流插件详解
-
AI大模型对编程的影响非常之大,可以说首当其冲,Cursor等对话式编程工具渐渐渗透到开发者的工作中,作为AI编程的明星产品,Cursor虽然好用,但是贵啊,所以咱们得找平替,最好免费那种。俗话说,不...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- libcrypto.so (74)
- linux安装minio (74)
- ubuntuunzip (67)
- vscode使用技巧 (83)
- logstashinput (65)
- vue阻止冒泡 (67)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)