如何使用VSCode+gdbserver远程调试ZMC900E

原创 ZLG致远电子 2025-05-22 11:37




视频推荐



由于嵌入式设备资源受限,通常无法在其上安装庞大的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®Cortex®-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接口
图片

EtherCAT 系列文章

【新品上市】ZMC900E 国产高性能EtherCAT总线控制器

【新品上市】ZLG致远电子PCIe EtherCAT通讯卡产品正式发布!

【技术分享】不借助Linux系统,在Windows下如何搭建ZMC900E交叉编译环境

【技术分享】关节电机驱动,解锁智能机器人 的“灵动” 密码

【技术分享】手把手带你入门AWStudio运动控制编程

【技术分享】面对快速迭代的技术,怎能忽视设备升级的高效与灵活性?

【技术分享】灵活连接,无限可能—探索EtherCAT的拓扑艺术

【技术分享】EtherCAT技术赋能工业储能,优化GOOSE网络实时性与效率

【技术分享】人形机器人时代已来,解锁未来智能奥秘

【技术分享】EtherCAT 分布式时钟简介

【200个电机驱动】如何实现EtherCAT分布式供电?

【200个电机驱动】如何同步运行?--基于EtherCAT的柔性电机驱动系统

【200个电机驱动】如何快速搭建柔性自动生产线?

【插针机PLC开发】用AWBlock开发运动逻辑

【插针机HMI开发】用AWTK开发人机界面

【技术分享】EtherCAT 数据帧格式和寻址方式简介

【技术分享】“脱胎换骨”--插针机运动控制

【技术分享】EtherCAT总线如何对从站固件进行升级?

【技术分享】EtherCAT冗余技术如何实现通信线缆断开的补救?

【技术分享】如何精准分析人形机器人运动数据?

【技术分享】为何EtherCAT在运动控制总线中如此受欢迎?

【产品应用】ZMC600E运动控制器直线和圆弧插补算法详解

【产品应用】ZMC600E运动控制器T型、S型速度规划详解

【产品应用】使用PCIe EtherCAT通讯卡控制IO从站step by step(一)

【产品应用】使用PCIe EtherCAT通讯卡控制IO从站step by step(二)

【产品应用】ZMC900E控制器之ROS2环境安装指南

【产品应用】EtherCAT主站控制器系统实时性测试

【产品应用】ZMC900E 国产EtherCAT主站控制器 — 电源口传导骚扰整改

【产品应用】ZMC300E EtherCAT主站控制器实现复杂的运动轨迹规划原理及应用

【产品应用】手把手带你使用ZMC300E绘图

【产品应用】三个步骤,让你的EtherCAT电机转起来

【产品应用】EtherCAT如何保障高效率、高实时性、高灵活性的现场总线通讯

【产品介绍】ZMC601E总线型边缘控制器 — 引领制造型企业数字化转型

【产品介绍】ZMC600E EtherCAT主站控制器全新上市

【产品介绍】ZLG推出新一代工业机器人解决方案,为工业机器人注入新的活力

评论
  • 一、前言多线程是 Java 的强大特性之一,它允许程序并发执行多个任务,提高资源利用率和响应能力。无论是 Web 服务、高性能计算、文件下载、图像处理,还是后台任务调度,多线程都是提升效率的利器。本篇文章将深入介绍 Java 多线程编程,包括创建线程、同步控制、线程通信、线程池与实际案例。二、Java 创建线程的三种方式2.1 方式一:继承 Thread 类java复制编辑publicclassMyThreadextendsThread { publicvoidrun() {
    小菜菜编程 2025-06-10 22:35 6668浏览
  • 1.03" CVBS 驱动方案 Micro-OLED显示技术因其高分辨率、高亮度、低功耗和小体积的优势,已成为微显示领域的首选方案。针对Micro-OLED在光学瞄准、夜视成像、工业检测、安防监控及户外探索等终端应用,上海冠显光电(TDO)设计开发了1.03"CVBS驱动方案。这一方案能够实现CVBS信号向Micro-OLED显示屏的稳定转换和显示控制,与市面上大多数光学瞄准应用终端无缝对接,满足行业对高质量、高性能显示解决方案的迫切需求。方案组成型号:TV103F1CSFS02&nb
    冠显光电MicroOLED代理视涯 2025-06-11 16:48 4661浏览
  • 七年前买了个远程控制开关,想想那个时候应该物联网才兴起的时候吧。如今因为控制麻烦且经常出现连接掉线问题,于是给淘汰了。这个设备我是拿来控制吊灯,特别麻烦的是,当晚上关灯后,会有一点灯点亮着,掉线的时候还会闪,想想睡梦中醒来往天花板一看,一个东西在那闪多吓人,关键还是绿色的。而且二次匹配需要打开灯罩,按那个黑色的按钮才能重新配网。种种原因,让我今天给他拆了,结构也简单,拆开外壳就只有一个主板正面正面电路看起来还是很简单的:220V经过整流桥(背面U1),通过变压器将市电转化低压直流电一个继电器,这
    二月半 2025-06-12 14:32 278浏览
  • 检测电磁铁性能需要系统性地考察多个关键指标。首先通过吸附测试评估磁力强度,可定量测量最大吸附重量或定性观察衔铁动作的灵敏性。电气参数检测包括测量线圈电阻值是否正常,以及通电后电流是否稳定在额定范围内。动态性能方面需测试响应时间和释放特性,记录通电吸合与断电分离的时效性。环境适应性验证要模拟电压波动和高温条件,观察磁力稳定性变化。安全检测环节必须检查绝缘状态和接线可靠性,运行中注意异常发热、异响等故障征兆。日常维护应保持磁极面清洁,定期复测线圈电阻。专业应用场合建议使用磁通计等仪器精确测量磁场参数
    锦正茂科技 2025-06-12 11:20 3889浏览
  • 一、前言在当今互联网应用中,网络编程是 Java 开发者必须掌握的一项关键技能。无论是构建聊天系统、文件传输、物联网交互,还是服务端 API 通信,Java 的网络编程提供了强大的支持。本文将从基础的 Socket 通信开始,逐步深入到多线程服务器开发,并提供图文实例帮助理解。二、Java 网络通信的基础概念Java 网络编程主要依赖于以下核心类:类名用途Socket客户端通信套接字ServerSocket服务器监听套接字InetAddressIP 地址解析与封装DatagramSocketUD
    小菜菜编程 2025-06-10 23:20 5851浏览
  • 一、前言文件处理是 Java 应用程序中最常见、最实用的功能之一,无论是读取配置文件、处理日志、批量处理 CSV,还是备份、压缩文件,都离不开对文件的高效操作。本篇文章将系统讲解 Java 文件操作的各个方面,包括文件读取、写入、复制、删除、压缩等,并提供实际代码示例。二、Java 文件与目录的基础操作2.1 使用 File 类检查文件属性java复制编辑import java.io.File; publicclassFileCheck { publicstaticvoidmai
    小菜菜编程 2025-06-10 22:34 6157浏览
  • 一、前言Java 除了广泛用于后端开发与跨平台服务,也支持图形用户界面(GUI)的开发。对于需要构建桌面应用、工具软件、图形交互系统的场景,Java 的 GUI 框架(如 Swing、JavaFX)提供了丰富的组件和事件机制。本文将带你入门 Swing GUI 开发,并通过一个实战项目,构建一个简单但完整的 Java 桌面应用。二、Java GUI 技术体系概览Java 支持多种 GUI 开发方式,最常见有:技术特点AWT最早的 GUI,依赖本地组件,跨平台性差SwingAWT 的增强版,组件完
    小菜菜编程 2025-06-10 23:21 6067浏览
  • 在自动驾驶时代奔涌向前的路上,仿真测试早已不再是可选项,而是验证智能驾驶系统安全性、鲁棒性和泛化能力的刚需,如何提升仿真测试的保真度已成为无法避免的重要话题。这正是“数字孪生”出现的时代背景。本文为大家详细介绍如何用传统与前沿结合的数字孪生构建流程,再配合3DGS 的神经网络重建技术,为自动驾驶仿真测试注入真正的“现实之眼”。一、从点云到高精地图的重建依托独家的aiData工具链与aiSim仿真平台,本文建立了一套高精度数字孪生地图构建流程,已经广泛应用于布达佩斯 Kolosy广场、ZalaZo
    康谋 2025-06-11 14:13 283浏览
  • Micro OLED作为下一代微显示技术的核心,广泛应用于AR/VR等HMD、汽车HUD、电子枪瞄、以及工业和医疗等高分辨率近眼显示领域。当前,Micro OLED的市场规模持续扩大,商业化进程不断加速,终端应用厂商急需加快产品验证步伐,抢占市场先机。为助力加速设计和开发,冠显光电推出了TV系列评估套件,帮助客户快速启动相关应用开发,提升验证效率,推动产品从概念到市场的快速落地。冠显0.39" Micro OLED显示解决方案主要包括0.39" 显示屏、FPC及驱动板,是TV系列中最小巧紧凑的一
    冠显光电MicroOLED代理视涯 2025-06-12 09:54 4001浏览
  • 电路图GPIO的中断类型相关API函数应用举例总结电路图在ESP32中内部有完整的控制电路,比如上下拉以及滤波器等,所以我们这里可以直接用一个微动开关连接到地。GPIO的中断类型GPIO_INTR_DISABLE不使能中断GPIO_INTR_POSEDGE上升沿触发GPIO_INTR_NEGEDGE下降沿触发GPIO_INTR_ANYEDGE上升沿和下降沿都触发GPIO_INTR_LOW_LEVEL低电平触发GPIO_INTR_HIGH_LEVEL高电平触发在GPIO中断应用中,一般使用上升沿或
    二月半 2025-06-12 10:11 242浏览
  • 夸克发布首个高考志愿大模型,为考生提供了智能化、个性化的志愿填报服务,这一创新对考生群体和传统报考机构产生了截然不同的影响。对于考生而言,夸克高考志愿大模型无疑是一大利好。该模型整合了教育官网、省招生办官网等权威信息源,确保数据准确可信,同时将高校毕业生就业信息、产业趋势等纳入知识库,为考生提供更全面的参考。通过深度搜索、志愿工具和志愿报告三大服务,夸克能精准理解考生需求,提供从专业适配性、地域优势到就业前景的全方位分析,并生成专属志愿报告和多种填报策略。这种智能化、个性化的服务大大减轻了考生和
    curton 2025-06-12 17:24 5817浏览
  • 磁学为啥神秘?1.磁学应用不直观。2.电感器使用量相对少。3.深度阐述书籍资料比较少。主要内容:第一章介绍磁学的基础概念,电磁感应,磁心损耗,气隙,趋肤效应,临近效应。第二章介绍磁性元件 电感原理与制造工艺,磁珠,变压器原理。第三章介绍应用电路 LC滤波器,谐振电路,射频中电感和变压器的应用,开关电源中变压器的应用。第四章介绍磁能的形态及转换,主要讲磁能存在哪里?转换过程,转换条件。第五章简介电感储能的相关问题,纠正常识性错误。第六章介绍变压器的常识性知识,如功率与初级匝数的关系。本书的阐述角度
    cow74562014 2025-06-10 22:41 284浏览
  • 近年来,随着全球能源转型和清洁能源行业的快速发展,户用光伏系统的装机量正呈逐年上升态势。同时,为了应对居民用电价格的显著上涨以及峰谷电价差异的持续扩大,在户用储能单元可大幅降低用电成本的背景下,各国正在大力扶持光伏配储政策,户用光储系统已逐步成为普通家庭应对电价波动与电网停机的经济之选。据高工产研储能研究所(GGII)统计数据显示,2024年全球户用储能装机规模约14GWh,GGII预计2025年全球户用储能市场规模将以25%的增速发展,装机规模将达到17.5GWh,整体增长趋势显著。而这也从侧
    华普微HOPERF 2025-06-12 14:16 443浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦