由于嵌入式設(shè)備資源受限,通常無法在其上安裝龐大的IDE調(diào)試程序,且許多嵌入式系統(tǒng)并無桌面環(huán)境。為了方便調(diào)試自開發(fā)程序,本文介紹利用VSCode與gdbserver進行嵌入式設(shè)備上程序的遠程調(diào)試方法。
?前言
嵌入式Linux系統(tǒng),由于系統(tǒng)資源的匱乏,通常無法安裝本地編譯器進行本地開發(fā),而需要在借助一臺主機進行交叉開發(fā)。一般情況下,在主機安裝相應(yīng)的交叉編譯器,將在主機編輯好的程序交叉編譯后,通過一定方式如以太網(wǎng)或者串口將程序下載到目標系統(tǒng)運行,或者進行調(diào)試。一般的交叉開發(fā)流程如圖1所示。關(guān)于Windows上搭建交叉編譯環(huán)境,可以參考《不借助Linux系統(tǒng),在Windows下如何搭建ZMC900E交叉編譯環(huán)境》。

圖1 嵌入式Linux交叉開發(fā)一般流程
由于系統(tǒng)資源限制,通常在ZMC600E/900E上無法安裝龐大的IDE來調(diào)試程序,同時ZMC600E/900E中默認不帶桌面。我們可以通過VSCode+ssh協(xié)議遠程到ZMC600E/900E來開發(fā)和運行程序,但通常只能在設(shè)備上通過gdb命令行程序進行調(diào)試。為了更加方便地調(diào)試程序,可以通過VSCode+gdbserver程序來實現(xiàn)遠程調(diào)試的目的。接下來將詳細介紹如何在Windows上實現(xiàn)遠程調(diào)試ZMC600E/900E。
?測試環(huán)境
1. 遠程設(shè)備:ZMC900E主站控制器2. 主機:Win103. IDE: VS Code4. 所需軟件環(huán)境:
- 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 交叉編譯工具鏈配置文件;③ 調(diào)試器aarch64-linux-gnu-gdb.exe gdbserver(arm Linux程序);④可以聯(lián)系我們技術(shù)支持獲取。
5. VSCode需要的插件:
圖2 VSCode中需要的插件6. 環(huán)境變量:
- 將交叉編譯鏈解壓到D:/aarch64-linux-gnu(或其他容易找到的地方),將D:/aarch64-linux-gnu/bin 加入環(huán)境變量。
- 將CMake和mingw64也加入到環(huán)境變量。
- 重啟使其生效。

圖3 Windows環(huán)境變量配置
7. OpenSSL
對win10及更新版本的Windows系統(tǒng),已默認包含在系統(tǒng)軟件中。舊版本W(wǎng)indows需要自行安裝。
?基本步驟
1. Windows下交叉編譯鏈的搭建,并嘗試編譯程序進行驗證;2. 在VSCode上搭建圖形化編譯環(huán)境;3. 搭建遠程gdbserver和本地gdb聯(lián)調(diào)。前兩步可以參考《不借助Linux系統(tǒng),在Windows下如何搭建ZMC900E交叉編譯環(huán)境》。
?遠程GDB調(diào)試
遠程調(diào)試的基本邏輯是:
- 將程序、動態(tài)庫、gdbserver以及ENI文件上傳遠程ZMC900E設(shè)備上,同時在本地需要保留一份一樣的程序用于調(diào)試;
- 在遠程ZMC900E上啟動gdbserver,在本地程序啟動aarch64-linux-gnu-gdb.exe程序遠程連接到服務(wù)器。
1. 修改CMakeLists.txt為Debug模式打開CMakeLists.txt,輸入以下內(nèi)容。
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)
其中新增了以下內(nèi)容:
- set(CMAKE_BUILD_TYPE Debug)配置編譯類型為debug模式;
- add_definitions(-Wall -ggdb -O0 -pipe)增加編譯參數(shù),-Wall開啟所有編譯警告與提示,指定調(diào)試器為gdb,并-O0關(guān)閉所有編譯優(yōu)化。
注意:set(CMAKE_BUILD_TYPE Debug) add_definitions(-Wall -ggdb -O0 -pipe)這兩行為debug必需,且不能開-O優(yōu)化,必須寫-O零,否則調(diào)試信息會不完整并錯亂,斷點或單步調(diào)試會錯位。2. 配置本地VSCode的gdb在側(cè)邊欄點Debug,打開下拉欄,點Add Configure,生成新的配置文件?;螯c擊“create a new launch.json file”。將以下配置復(fù)制進去并作相應(yīng)修改,保存。

圖4 配置launch.json

圖5 配置launch.json 2在launch.json中寫入以下內(nèi)容。
{// 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調(diào)試的配置項大多都在這個文件中。下面會對文件中的每個需要配置的選項進行說明:2.1 "program": "${workspaceFolder}/build/${fileBasenameNoExtension}",此選項要指向放在本地的要執(zhí)行的程序。例如可以寫成${workspaceFolder}/build/hello。fileBasenameNoExtension的意思是,如果當前主界面打開hello.c源文件,則fileBasenameNoExtension == hello,將啟動同名程序調(diào)試,根據(jù)實際情況替換為實際程序名或保留。
2.2 "args": ["test.xml"],傳給程序的命令行參數(shù)。注意調(diào)試EtherCAT的時候,命令行參數(shù)ENI文件名從此項配置傳入,但是ENI文件必須先上傳到ZMC900E,與gdbserver和調(diào)試程序放在同一路徑下。2.3
{"description":"set up remote debug program","text":"set remote exec-file${fileBasenameNoExtension}","ignoreFailures":false}
項設(shè)置配合gdbserver --multi COM使用,可以避免頻繁重啟gdbserver,${fileBasenameNoExtension}同樣根據(jù)實際情況替換為實際程序名或保留。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并放在和待執(zhí)行程序同一路徑下,切換到工作路徑,運行。
# ZMC900E./gdbserver --multi 192.168.1.136:200
此處參數(shù)—multi(兩條杠)可以避免頻繁啟動gdbserver,使其開啟后可以反復(fù)遠程連接。192.168.1.136為與電腦連接的網(wǎng)口的IP地址,net1默認為192.168.1.136。端口號選擇一個不會和其他程序沖突的端口,例如2000。4. VSCode連接遠程gdbserver,開始調(diào)試在VSCode中,打開源代碼,在gdb調(diào)試頁中選擇剛剛配置的調(diào)試選項,按F5,等待其連接并運行。

圖6 啟動遠程調(diào)試可以看到程序成功運行且斷點有效,并且變量列表里也可以實時獲取變量的值,可進行單步調(diào)試,與本地程序調(diào)試無異。5. VSCode Debug調(diào)試界面介紹首先介紹工具欄。啟動調(diào)試后,會在代碼編輯界面上方浮動一個工具欄。該工具欄的功能從左到右為:繼續(xù)運行、按行/步驟運行、按步運行、運行直到當前調(diào)用棧退出、重新啟動程序和停止調(diào)試。
圖7 調(diào)試工具欄左側(cè)從上往下進行介紹。VARIABLES是變量窗口,可以查看局部變量和全局變量的值,還可以在調(diào)試中手動修改值進行測試。WATCH是監(jiān)視窗口,可以將變量或表達式添加進去進行持續(xù)查看。CALL STACK是程序當前的調(diào)用棧情況。BREAKPOINTS是當前調(diào)試的斷點情況。
圖8 調(diào)試變量、監(jiān)測、調(diào)用棧和斷點等窗口下方log會打印VSCode gdb插件的一些日志信息。
圖9 VSCode gdb插件日志在ZMC900E上,gdbserver也會打印一些日志。

圖10 gdbserver日志 ?注意事項
gdbserver開啟后由于捕捉了SIGNT信號,即ctrl+C信號,無法用命令行直接退出。如果要退出gdbserver可以另外開一個終端,用ps -A查看pid,然后kill -9 pid。 ?ZMC900E高性能EtherCAT主站控制器

圖11ZMC900E高性能EtherCAT主站控制器
ZMC900E是ZLG致遠電子開發(fā)的最新一代EtherCAT主站控制器,其核心采用多核異構(gòu)的應(yīng)用處理器,內(nèi)核包括4+1個64位的ArmCortex-A55核,主頻2GHz;3個Cortex-R5F內(nèi)核,主頻800MHz。同時板載4GB LPDDR4、8GB eMMC以及32KB FRAM。
ZMC900E EtherCAT主站控制器為了滿足不同的自動化應(yīng)用需求,集成1路專用EtherCAT口、3路通用以太網(wǎng)、1路CANFD、1路RS485、1路TF卡、1路USB3.0 Host、1路HDMI接口、16路Dl數(shù)字輸入、16路DO數(shù)字輸出等接口,靈活滿足自動化設(shè)備應(yīng)用需求。
ZMC900E 示意圖及接口圖如下所示:
圖12ZMC900E接口
-
遠程調(diào)試
+關(guān)注
關(guān)注
0文章
58瀏覽量
8853 -
GDBServer
+關(guān)注
關(guān)注
0文章
5瀏覽量
2488 -
vscode
+關(guān)注
關(guān)注
1文章
169瀏覽量
8851
發(fā)布評論請先 登錄
在VSCode中使用J-Link調(diào)試嵌入式系統(tǒng)

vscode remote ssh + gdbserver 調(diào)試
VS Code + gdbserver嵌入式arm遠程調(diào)試的過程是怎樣的
通過VSCode對RISC-V進行遠程調(diào)試并開發(fā)
GDBServer編譯指南_基于 EasyARM-i.MX287A 開發(fā)套件
使用 VSCode 遠程 圖形化 GDB 調(diào)試 嵌入式linux

如何使用gdbserver對目標開發(fā)板上的程序進行遠程調(diào)試
ZMC900E 國產(chǎn)EtherCAT主站控制器 — 電源口傳導(dǎo)騷擾整改

ZMC900E控制器之ROS2環(huán)境安裝指南

探索工業(yè)自動化核心:ZMC 系列 EtherCAT 主站控制器

從站熱插拔技術(shù):ZMC900E 助力自動化系統(tǒng)靈活擴展與穩(wěn)定運行

解鎖PWM功能:ZMC900E主站控制器的高效應(yīng)用指南

深入ZMC900E:主站控制器編碼器的使用與優(yōu)勢

評論