arm開發板 GDB遠程調試方法

1.前言

1.在linux下開發,免不了使用gdb調試,但是linux下開發嵌入式,都是跑在ARM板子上的,網上有很多GDB的基礎教程,但是能在ARM開發板用的時候,會有各種問題。
比如:*.cpp: No such file or directory.這是因為用gcc編譯的時候,代碼還是在本地,并沒有在arm平臺上來。
所以說還是有必要出一個arm端使用gdb教程

2.下載,編譯gdb服務端(運行在arm端)

1.下載gdb8.3:下載地址
我也試過其他版本的gdb,比如說gdb7.6,會缺少一些依賴庫termcap,搞起來挺麻煩的,所以還是推薦使用gdb8.3吧。配置編譯安裝一步過。

1.解壓。

tar -xzf gdb-8.3.tar.gz
cd gdb-8.3

2.配置

./configure --prefix="$PWD/_install" --disable-shared --target=aarch64-himix210-linux --host=aarch64-himix210-linux
記住aarch64-himix210-linux換成自己的編譯器

3.編譯

make -j8
make install
最后的結果gcore gdb gdb-add-index gdbserver run文件在gdb-8.3/install/bin目錄下,拷貝到arm的rootfs中備用。

3.編譯gdb服務端(運行在arm端)

1.清理gdb工程

make distclean

2.配置,編譯,安裝

./configure --target=aarch64-himix210-linux --prefix="~/.local/bin" –program-prefix=aarch64-himix210-linux
說明:
1.–target=aarch64-himix210-linux 意思是說目標平臺是運行于ARM體系結構的linux內核;
2.–program-prefix=aarch64-himix210-linux 是指生成的可執行文件的前綴,比如aarch64-himix210-linux-gdb(可選參數)
3.–prefix= 是指生成的可執行文件安裝在哪個目錄,這個目錄需要根據實際情況作選擇。如果該目錄不存在,會自動創建(當然,權限足夠的話)

編譯,安裝
make
make install

4.使用

4.1前期準備

將之前生成的 gdbserver 調試程序放在目標板上或者通過 nfs 方式運行也可以.這樣就可以用 gdb 和 gdbserve 遠程調用來調試目標板上的程序了。


一般情況 gdbserver 程序較大,所以建議采用 nfs 的方式掛載在目標板上運行較好,也可以通過 strip 減少 gdbserver 的大小(刪除程序中符號表、調試符號表信息等)

4.2在arm板上運行gdbserver

./gdbserver --remote-debug 192.168.1.100:8005 helloworld
192.168.1.100 為PC開發主機的 IP 地址; 8005 是用來作為 gdb 調試監聽的端口,可自行設置;helloworld是編譯好的目標操作程序

為了更好地使用 gdb 的調試功能,
在編譯目標板程序helloworld時需加入gcc -g 選項,
或者CMakelists.txt中添加
SET(CMAKE_BUILD_TYPE "Debug") SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb") SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

4.3 在PC上運行gdb

1、在宿主機上運行 gdb 程序
./aarch64-himix210-linux helloworld
aarch64-himix210-linux-gdb 是編譯 gdb 生成安裝在 bin 目前錄下的文件,名稱可能因為設置了 –program-prefix 參數有所改變,helloworld是和目標板上的 helloworld一樣的程序文件
2、進入 gdb 調試狀態后,連接目標板
(gdb) target remote 192.168.1.102:8005
192.168.1.102 為ARM板的 IP 地址,8005 則是 gdb 調試監聽的端口
3、連接成功后則開始運行,pc機之后根據 gdb 指令設置斷點、單步調試等功能進行調試
(gdb) r

5 附:GDB常用的調試指令

GDB 調試器提供有大量的調試選項,可滿足大部分場景中調試代碼的需要。如表所示,羅列了幾個最常用的調試指令(包含指令縮寫)及各自的作用:

GDB常用的調試指令
GDB 調試器提供有大量的調試選項,可滿足大部分場景中調試代碼的需要。如表所示,羅列了幾個最常用的調試指令(包含指令縮寫)及各自的作用:

調試指令作 用
(gdb) break xxx
(gdb) b xxx
在源代碼指定的某一行設置斷點,其中 xxx 用于指定具體打斷點的位置。
(gdb) run xxx
(gdb) r
執行被調試的程序,其會自動在第一個斷點處暫停執行
(gdb) continue
(gdb) c
當程序在某一斷點處停止運行后,使用該指令可以繼續執行,直至遇到下一個斷點或者程序結束。
(gdb) next
(gdb) n
令程序一行代碼一行代碼的執行。
(gdb) print xxx
(gdb) p xxx
打印指定變量的值,其中 xxx 指的就是某一變量名。
(gdb) list
(gdb) l
顯示源程序代碼的內容,包括各行代碼所在的行號。
(gdb) quit
(gdb) q
退出。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/43365.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43365.shtml
英文地址,請注明出處:http://en.pswp.cn/news/43365.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android su

1. userdebug和user版本 2. 關閉selinux system/core diff --git a/init/selinux.cpp b/init/selinux.cpp index 5a0255acd..787917274 100644--- a/init/selinux.cpp b/init/selinux.cpp -104,6 104,8 EnforcingStatus StatusFromCmdline() { } bool IsEnforcing() { …

元宇宙時代超高清視音頻技術白皮書關于流媒體協議和媒體傳輸解讀

流媒體協議 元宇宙業務場景對流媒體傳輸的實時性和互動性提出了更高的要求,這就需要在傳統的 RTMP、SRT、 HLS 等基礎上增加實時互動的支持。實時互動,指在遠程條件下溝通、協作,可隨時隨地接入、實時地傳遞虛實融合的多維信息,身…

萬賓燃氣管網監測解決方案,守護城市生命線安全

方案背景 城市燃氣管網作為連接天然氣長輸管線與天然氣用戶的橋梁,擔負著向企業和居民用戶直接供氣的重要職責。隨著城市燃氣需求的急劇增加,城市燃氣管網規模日趨龐大,安全隱患和風險也隨之增加。目前,我國燃氣管網的運行仍存在…

Mathematica(42)-計算N個數值的和

比如,我們要用Mathematica求得到下面的式子: 這就需要用到一個函數:Sum 具體地,Sum函數的使用形式如下: 因此,按照公式就可以得到下面的結果: 如果,我們想要將求和號也加進去&#…

Jenkins的流水線啟動jar后未執行問題處理

現象 在流水線里配置了啟動腳本例如,nohup java -jar xxx.jar >nohup.out 2>&1 & 但是在服務器發現服務并未啟動,且nohup日志里沒輸出日志,這樣的原因是jenkins在執行完腳本后,就退出了這個進程。 在啟動腳本執行jar命令的上一步加入以下…

【AIGC 訊飛星火 | 百度AI|ChatGPT| 】智能對比

AI智能對比 🍸 前言🍺 概念類對比🍵 訊飛🍵 百度AI🍵 chatGPT 🍹 功能類對比? 訊飛? 百度AI? chatGPT 🥃 可輸入字數對比🥤 百度AI🥤 訊飛🥤 chatGPT &…

【Django】Task1安裝python環境及運行項目

【Django】Task1安裝python環境及運行項目 寫在最前 8月份Datawhale組隊學習,在這個群除我佬的時代,寫一下blog記錄學習過程。 參考資源: 學習項目github:https://github.com/Joe-2002/sweettalk-django4.2 隊長博客&#xff1a…

RocketMQ 消息消費 輪詢機制 PullRequestHoldService

1. 概述 先來看看 RocketMQ 消費過程中的輪詢機制是啥。首先需要補充一點消費相關的前置知識。 1.1 消息消費方式 RocketMQ 支持多種消費方式,包括 Push 模式和 Pull 模式 Pull 模式:用戶自己進行消息的拉取和消費進度的更新Push 模式:Broker…

探索心律失常:病因、診斷與治療以及與腸道菌群的關聯

谷禾健康 你是否有時會感到心悸、心慌、胸悶、氣短、頭暈、乏力?你是否有時感覺自己的心跳過快或過慢? 如果有上述情況,就要引起重視了,你可能存在心律失常。心律失常是最常見的心臟疾病之一,涉及到心臟的電活動節奏異…

麻辣燙數據可視化,麻辣燙市場將持續蓬勃發展

麻辣燙,這道源自中國的美食,早已成為人們生活中不可或缺的一部分。它獨特的香辣口味,讓人忍不住每每流連忘返。與人們的關系,簡直如同摯友一般。每當寒冷的冬日或疲憊的時刻,麻辣燙總是悄然走進人們的心房,…

i.MX6ULL開發板無法進入NFS掛載文件系統的解決辦法

問題 使用NFS網絡掛載文件系統后卡住無法進入系統。 解決辦法 此處不詳細講述NFS安裝流程 查看板卡掛載在/home/etc/rc.init下的自啟動程序 進入到../../home/etc目錄下,查看rc.init文件,首先從第一行排查,查看/home/etc/netcfg文件代碼內容&…

Flask-SQLAlchemy

認識Flask-SQLAlchemy Flask-SQLAlchemy 是一個為 Flask 應用增加 SQLAlchemy 支持的擴展。它致力于簡化在 Flask 中 SQLAlchemy 的使用。SQLAlchemy 是目前python中最強大的 ORM框架, 功能全面, 使用簡單。 ORM優缺點 優點 有語法提示, 省去自己拼寫SQL,保證SQL…

Python爬蟲——scrapy_crawlspider讀書網

創建crawlspider爬蟲文件: scrapy genspider -t crawl 爬蟲文件名 爬取的域名scrapy genspider -t crawl read https://www.dushu.com/book/1206.htmlLinkExtractor 鏈接提取器通過它,Spider可以知道從爬取的頁面中提取出哪些鏈接,提取出的鏈…

spring的核心技術---bean的生命周期加案例分析詳細易懂

目錄 一.spring管理JavaBean的初始化過程(生命周期) Spring Bean的生命周期: 二.spring的JavaBean管理中單例模式及原型(多例)模式 2.1 . 默認為單例,但是可以配置多例 2.2.舉例論證 2.2.1 默認單例 2.2…

前端常用算法(一):防抖+節流

目錄 第一章 防抖 1.1 防抖(debounce)簡介 1.2 應用場景 1.3 實現思路 1.4 手撕防抖代碼 第二章 節流 2.1 節流(throttle)簡介 2.2 應用場景 2.3 實現思路 2.4 手撕節流代碼(方法:時間戳和計時器…

MR300C工業無線WiFi圖傳模塊 內窺鏡機器人圖像傳輸有線無線的兩種方式

MR300C無線WiFi圖傳模使用方法工業機器人圖像高清傳輸 ? MR300C圖傳模塊基于MIPS處理器實現,電腦/手機連接模塊的WIFI熱點或網口即可查看視頻流 ? 模塊的USB 2.0 Host接口,可接入USB uvc攝像頭/內窺鏡默認輸出的視頻格式必須是MJPG ? 模塊支持接入攝…

計算機競賽 圖像識別-人臉識別與疲勞檢測 - python opencv

文章目錄 0 前言1 課題背景2 Dlib人臉識別2.1 簡介2.2 Dlib優點2.3 相關代碼2.4 人臉數據庫2.5 人臉錄入加識別效果 3 疲勞檢測算法3.1 眼睛檢測算法3.3 點頭檢測算法 4 PyQt54.1 簡介4.2相關界面代碼 5 最后 0 前言 🔥 優質競賽項目系列,今天要分享的是…

在 PyTorch 中使用關鍵點 RCNN 進行人體姿勢估計--附源碼

人體姿態估計是計算機視覺領域的一個重要研究領域。它涉及估計人體上的獨特點,也稱為關鍵點。在這篇博文中,我們將討論一種在包含人類的圖像上查找關鍵點的算法,稱為Keypoint-RCNN。該代碼是使用 Pytorch 使用Torchvision庫編寫的。 假設您想要建立一名私人健身教練,可以通…

MongoDB升級經歷(4.0.23至5.0.19)

MongoDB從4.0.23至5.0.19升級經歷 引子:為了解決MongoDB的兩個漏洞決定把MongoDB升級至最新版本,期間也踩了不少坑,在這里分享出來供大家學習與避坑~ 1、MongoDB的兩個漏洞 漏洞1:MongoDB Server 安全漏洞(CVE-2021-20330) 漏洞2…

SpringBoot + Vue 微人事(十二)

職位批量刪除實現 編寫后端接口 PositionController DeleteMapping("/")public RespBean deletePositionByIds(Integer[] ids){if(positionsService.deletePositionsByIds(ids)ids.length){return RespBean.ok("刪除成功");}return RespBean.err("刪…