0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

ZLG致远电子 2025-05-22 11:40 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

由于嵌入式设备资源受限,通常无法在其上安装庞大的IDE调试程序,且许多嵌入式系统并无桌面环境。为了方便调试自开发程序,本文介绍利用VSCode与gdbserver进行嵌入式设备上程序的远程调试方法。


6faa2c28-36be-11f0-8605-92fbcf53809c.jpg  前言

嵌入式Linux系统,由于系统资源的匮乏,通常无法安装本地编译器进行本地开发,而需要在借助一台主机进行交叉开发。一般情况下,在主机安装相应的交叉编译器,将在主机编辑好的程序交叉编译后,通过一定方式如以太网或者串口将程序下载到目标系统运行,或者进行调试。一般的交叉开发流程如图1所示。关于Windows上搭建交叉编译环境,可以参考《不借助Linux系统,在Windows下如何搭建ZMC900E交叉编译环境》。

6fb16768-36be-11f0-8605-92fbcf53809c.png

图1 嵌入式Linux交叉开发一般流程

由于系统资源限制,通常在ZMC600E/900E上无法安装庞大的IDE来调试程序,同时ZMC600E/900E中默认不带桌面。我们可以通过VSCode+ssh协议远程到ZMC600E/900E来开发和运行程序,但通常只能在设备上通过gdb命令行程序进行调试。为了更加方便地调试程序,可以通过VSCode+gdbserver程序来实现远程调试的目的。接下来将详细介绍如何在Windows上实现远程调试ZMC600E/900E。


6fb95e0a-36be-11f0-8605-92fbcf53809c.jpg  测试环境

1. 远程设备:ZMC900E主站控制器2. 主机:Win103. IDE: VS Code4. 所需软件环境:

  • cmake版本3.xx,推荐3.20及以上版本
  • mingw64(主要需要mingw32-make.exe)获取最新版本
  • 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

6fc2c756-36be-11f0-8605-92fbcf53809c.png6fdd69bc-36be-11f0-8605-92fbcf53809c.png图2 VSCode中需要的插件6. 环境变量:

  • 将交叉编译链解压到D:/aarch64-linux-gnu(或其他容易找到的地方),将D:/aarch64-linux-gnu/bin 加入环境变量。
  • 将CMake和mingw64也加入到环境变量。
  • 重启使其生效。
6fe76ff2-36be-11f0-8605-92fbcf53809c.png

图3 Windows环境变量配置

7. OpenSSL

对win10及更新版本的Windows系统,已默认包含在系统软件中。旧版本Windows需要自行安装。


6faa2c28-36be-11f0-8605-92fbcf53809c.jpg  基本步骤

1. Windows下交叉编译链的搭建,并尝试编译程序进行验证;2. 在VSCode上搭建图形化编译环境;3. 搭建远程gdbserver和本地gdb联调。前两步可以参考《不借助Linux系统,在Windows下如何搭建ZMC900E交叉编译环境》。


6faa2c28-36be-11f0-8605-92fbcf53809c.jpg  远程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(testtest.c)
target_link_options(testPRIVATE -lpthread -lrt -ldl -lstdc++ -lm)target_link_libraries(testzecm)

其中新增了以下内容:

  • 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”。将以下配置复制进去并作相应修改,保存。

6ffefff0-36be-11f0-8605-92fbcf53809c.png

图4 配置launch.json

70095220-36be-11f0-8605-92fbcf53809c.png

图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上的远程gdbserverssh远程登录到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,等待其连接并运行。

70144644-36be-11f0-8605-92fbcf53809c.png

图6 启动远程调试可以看到程序成功运行且断点有效,并且变量列表里也可以实时获取变量的值,可进行单步调试,与本地程序调试无异。5. VSCode Debug调试界面介绍首先介绍工具栏。启动调试后,会在代码编辑界面上方浮动一个工具栏。该工具栏的功能从左到右为:继续运行、按行/步骤运行、按步运行、运行直到当前调用栈退出、重新启动程序和停止调试。

701f83ec-36be-11f0-8605-92fbcf53809c.png

图7 调试工具栏左侧从上往下进行介绍。VARIABLES是变量窗口,可以查看局部变量和全局变量的值,还可以在调试中手动修改值进行测试。WATCH是监视窗口,可以将变量或表达式添加进去进行持续查看。CALL STACK是程序当前的调用栈情况。BREAKPOINTS是当前调试的断点情况。

70269b64-36be-11f0-8605-92fbcf53809c.png

图8 调试变量、监测、调用栈和断点等窗口下方log会打印VSCode gdb插件的一些日志信息。

702df206-36be-11f0-8605-92fbcf53809c.png

图9 VSCode gdb插件日志在ZMC900E上,gdbserver也会打印一些日志。

7039fdc6-36be-11f0-8605-92fbcf53809c.png

图10 gdbserver日志
6faa2c28-36be-11f0-8605-92fbcf53809c.jpg  注意事项

gdbserver开启后由于捕捉了SIGNT信号,即ctrl+C信号,无法用命令行直接退出。如果要退出gdbserver可以另外开一个终端,用ps -A查看pid,然后kill -9 pid。
6fb95e0a-36be-11f0-8605-92fbcf53809c.jpg  ZMC900E高性能EtherCAT主站控制器

70491e82-36be-11f0-8605-92fbcf53809c.jpg

图11ZMC900E高性能EtherCAT主站控制器

ZMC900E是ZLG致远电子开发的最新一代EtherCAT主站控制器,其核心采用多核异构的应用处理器,内核包括4+1个64位的ArmCortex-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 示意图及接口图如下所示:

705489ca-36be-11f0-8605-92fbcf53809c.jpg

图12ZMC900E接口

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 远程调试
    +关注

    关注

    0

    文章

    58

    浏览量

    8878
  • GDBServer
    +关注

    关注

    0

    文章

    5

    浏览量

    2519
  • vscode
    +关注

    关注

    1

    文章

    171

    浏览量

    9008
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    VSCode中使用J-Link调试嵌入式系统

    Visual Studio Code是微软推出的免费的源代码编辑器,通过插件,可以实现GDB +J-Link+GDBServer方式在VSCode调试嵌入式系统。
    发表于 08-18 11:06 2993次阅读
    在<b class='flag-5'>VSCode</b>中使用J-Link<b class='flag-5'>调试</b>嵌入式系统

    vscode remote ssh + gdbserver 调试

    问题的还是不够高效,命令行形式gdb还是太简陋了,在IDE debug代码打断点,查堆栈变量那些习以为常的东西,在gdb这里怎么用怎么不习惯,可视化操作不比敲命令行来的香吗?最近正好研究了下vscode remote ssh + gdbserver
    发表于 11-04 06:02

    嵌入式远程调试工具gdbserver怎么使用?

    嵌入式远程调试工具gdbserver怎么使用?
    发表于 12-24 07:26

    VS Code + gdbserver嵌入式arm远程调试的过程是怎样的

    VS Code + gdbserver嵌入式arm远程调试的过程是怎样的
    发表于 12-24 07:43

    通过VSCode对RISC-V进行远程调试并开发

    /x86_64-linux-gnu/libncursesw.so.5VSCode远程开发通过VSCode远程到ubuntu中,这里可以参考Window SSH
    发表于 09-19 16:16

    GDBServer编译指南_基于 EasyARM-i.MX287A 开发套件

    本文基于 EasyARM-i.MX287A 开发套件,介绍如何编译 GDBServer 软件以使用开发套件的远程调试功能。
    发表于 12-15 11:48 0次下载

    使用 VSCode 远程 图形化 GDB 调试 嵌入式linux

    问题的还是不够高效,命令行形式gdb还是太简陋了,在IDE debug代码打断点,查堆栈变量那些习以为常的东西,在gdb这里怎么用怎么不习惯,可视化操作不比敲命令行来的香吗?最近正好研究了下vscode remote ssh + gdbserver
    发表于 11-01 17:06 1次下载
    使用 <b class='flag-5'>VSCode</b> <b class='flag-5'>远程</b> 图形化 GDB <b class='flag-5'>调试</b> 嵌入式linux

    VSCode使用-搭建python运行调试环境

    VSCode是一个优秀的编辑工具,适合代码阅读,代码编辑,甚至配置好之后,可以编译与调试代码。
    的头像 发表于 05-04 10:00 1838次阅读
    <b class='flag-5'>VSCode</b>使用-搭建python运行<b class='flag-5'>调试</b>环境

    如何使用gdbserver对目标开发板上的程序进行远程调试

    本篇讲解如何使用 gdbserver 对目标开发板上的程序进行远程调试。 安装 GDBSERVER 首先在开发板上安装 gdbserver
    的头像 发表于 10-04 15:27 2531次阅读

    ZMC900E 国产EtherCAT主站控制器 — 电源口传导骚扰整改

    为确保EtherCAT主站控制器在工业自动化中的可靠和稳定应用,EMC测试至关重要。本文以ZMC900E电源传导骚扰整改为例,深入解析EMC原理,助您精准定位问题,避免无效整改。图1ZMC900E
    的头像 发表于 03-07 08:23 1910次阅读
    <b class='flag-5'>ZMC900E</b> 国产EtherCAT主站控制器 — 电源口传导骚扰整改

    ZMC900E控制器之ROS2环境安装指南

    ZMC900E是致远电子研发的最新一代高性能EtherCAT控制器,支持ROS2系统,兼备强大功能和实时性,为工业应用带来新的可能。本文将详述ROS2特点和安装,助力用户在机器人上的二次开发
    的头像 发表于 04-29 08:24 1469次阅读
    <b class='flag-5'>ZMC900E</b>控制器之ROS2环境安装指南

    探索工业自动化核心:ZMC 系列 EtherCAT 主站控制器

    且高效的控制解决方案成为企业提升竞争力的关键。广州致远电子股份有限公司推出的ZMC60EZMC600EZMC900E以及ZMC900E-Lite这一系列卓越的
    的头像 发表于 08-18 11:35 778次阅读
    探索工业自动化核心:<b class='flag-5'>ZMC</b> 系列 EtherCAT 主站控制器

    从站热插拔技术:ZMC900E 助力自动化系统灵活扩展与稳定运行

    从站热插拔技术,让工业自动化系统在运行中实现系统的扩展、维护或更换,极大地提升了自动化系统的可用性和生产效率。本文将深入探讨其原理与ZMC900E控制器的应用。从站热插拔的基本概念与应用场景从站
    的头像 发表于 09-01 11:35 1625次阅读
    从站热插拔技术:<b class='flag-5'>ZMC900E</b> 助力自动化系统灵活扩展与稳定运行

    解锁PWM功能:ZMC900E主站控制器的高效应用指南

    在当今的自动化控制领域,ZMC900E主站控制器凭借其卓越的性能和丰富的功能,成为了众多工程师和项目开发者的首选。今天,我们重点探讨一下ZMC900E主站控制器中一项极为强大的功能—PWM
    的头像 发表于 09-05 11:35 564次阅读
    解锁PWM功能:<b class='flag-5'>ZMC900E</b>主站控制器的高效应用指南

    深入ZMC900E:主站控制器编码器的使用与优势

    视频推荐在工业自动化领域,编码器是确保设备精准运行的关键部件。本期我们将深入探讨ZMC900E主站控制器中的编码器功能。编码器编码器是一种用于测量机械运动的传感器,它能够将机械运动转换为电信号,用于
    的头像 发表于 09-11 11:34 563次阅读
    深入<b class='flag-5'>ZMC900E</b>:主站控制器编码器的使用与优势