搭建嵌入式GDB调试环境以及VSCode+gdbserver 图形化调试

目录

1 搭建嵌入式gdb调试环境

1.1 交叉编译工具链自带的gdb和gdbserver

1.2 使用gdb进行嵌入式程序调试

1.2.1编写简单测试程序

1.2.2 gdb调试程序

1.3 源码编译gdb和gdbserver

1.3.1 下载gdb和gdbserver源码

 1.3.2 编译gdb

1.3.3 移植gdbserver

2 VSCode+gdbserver 图形化调试


1 搭建嵌入式gdb调试环境

一般的桌面 Linux 系统,比如 ubuntu、centos 等,我们可以直接运行 gdb 来调试程序。但是嵌入式中芯片性能一般比较弱,所以直接在嵌入式系统中运行 gdb 不太现实(性能强大的嵌入式芯片可以这么做)。嵌入式系统中一般在 PC 端运行 gdb 工具,源码也是在 PC 端,源码对应的可执行文件放到开发板中运行。为此我们需要在开发板中运行 gdbserver,通过网络与 PC 端的 gdb 进行通信。因此要想在 PC 上通过 gdb 调试嵌入式程序,那么需要两个东西:gdb 和gdbserver,其中gdb 是运行在 PC 上的,gdbserver 需要我们移植到开发板上。

1.1 交叉编译工具链自带的gdb和gdbserver

一般来说交叉编译工具链都自带了gdb和gdbserver,因此可以不用移植,我去试了下,发现gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf里面自带的gdbserver不能用

 我把他放到开发板上执行,提示

[root@imx6ull:/mnt]# ./gdbserver
-bash: ./gdbserver: No such file or directory

然后我又试了下gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf的gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/bin这个目录下的gdbserver放到开发板上是可以用的

那么gdb我也用7.5.0里面的gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gdb。

1.2 使用gdb进行嵌入式程序调试

1.2.1编写简单测试程序

首先编写一个简单的测试程序,用于调试

#include <stdio.h>
#include <unistd.h>int main(int argc, char *argv[])
{unsigned int times = 0;while(1) {printf("runing times:%d\r\n", times);times++;sleep(1);}
}

然后使用如下命令进行编译

arm-linux-gnueabihf-gcc test.c -o test -g      //要使用-g选项才会有调试信息 

然后我把他放到了开发板的/mnt目录下

1.2.2 gdb调试程序

首先在开发板上执行如下命令

./gdbserver :1234 test

在开发版上执行命令的时候,是不需要指定IP地址的,只需要指定端口号即可,然后他就会一直监听

然后在电脑上用下面的命令开始调试

./arm-linux-gnueabihf-gdb test  #我这里加了./是因为我没把这个交叉编译工具链加到环境变量中

然后再用下面的命令去连接开发板

target remote 172.31.8.195:1234

 这时候开发板上也会发现被连接了

接下来就可以在电脑上调试程序了

比如看一下源码

 比如我在main函数的第一行设置断点

1.3 源码编译gdb和gdbserver

如果交叉编译工具链里面没有gdb和gdbserver,那么就要自己源码编译gdb和gdbserver,方法如下。

1.3.1 下载gdb和gdbserver源码

去网址:  http://www.gnu.org/software/gdb/download/

然后解压

tar xzvf gdb-13.2.tar.gz

 1.3.2 编译gdb

在交叉编译configure时,通常会需要设置--build、--host和--target选项。各个选项的含义如下:

--build:编译所用的机器的平台。

--host:编译出的代码运行的平台。

--target:编译出来的工具链生成的代码的运行平台。这个选项不常用,一般只在编译gcc、ld等工具链的过程中用到,编译gdb,gdbserver时也会用到。

在不涉及到交叉编译的时候,--build、--host、--target是一样的,不需要特别设置。交叉编译的时候,比如需要在x86平台编译arm程序,就需要设置--build和--host选项。

通常,本机上的gcc、ld等工具是没有前缀的,这个时候--build可以设置为空。交叉编译工具链通常都有一个前缀,比如arm-unknown-linux-gnueabi-gcc,这个时候,--host就要设置为arm-unknown-linux-gnueabi。

Example:

./configure --build='' --host=arm-unknown-gnueabi

然后用如下命令开始编译、安装

cd gdb-13.2/
mkdir /data/chw/imx6ull_20230512/nfs_rootfs/gdb_install
./configure --target=arm-linux-gnueabihf --prefix=/data/chw/imx6ull_20230512/nfs_rootfs/gdb_install
make -j8
make install

上面编译的过程中如果报错,

gdb-13.2/missing: makeinfo: not found
WARNING: 'makeinfo' is missing on your system.You should only need it if you modified a '.texi' file, orany other file indirectly affecting the aspect of the manual.You might want to install the Texinfo package:<http://www.gnu.org/software/texinfo/>The spurious makeinfo call might also be the consequence ofusing a buggy 'make' (AIX, DU, IRIX), in which case you mightwant to install GNU make:<http://www.gnu.org/software/make/>
Makefile:1794: recipe for target 'doc/bfd.info' failed

那就

sudo apt-get install texinfo

如果报错

configure: error: GMP is missing or unusable
Makefile:11803: recipe for target 'configure-gdb' failed
make[1]: *** [configure-gdb] Error 1
make[1]: *** Waiting for unfinished jobs....

那就用下面的方法

apt-get install libgmp-dev

编译安装完之后,得到

这里就不修改PATH环境变量了,测试的时候直接加路径。

1.3.3 移植gdbserver

gdbserver是在开发板上运行的,需要交叉编译,gdbserver源码在./gdb-13.2/gdbserver里面

cd ./gdb-13.2/gdbserver
./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc  CXX=arm-linux-gnueabihf-g++  AR=arm-linux-gnueabihf-ar LD=arm-linux-gnueabihf-ld --prefix=/data/chw/imx6ull_20230512/nfs_rootfs/gdbserver_install  //配置                            
make

报错

../gdbsupport/libgdbsupport.a: error adding symbols: File format not recognized
collect2: error: ld returned 1 exit status
Makefile:361: recipe for target 'gdbreplay' failed
make: *** [gdbreplay] Error 1
make: *** Waiting for unfinished jobs....

这个问题我是这么想的,这个libgdnsupport.a库是在前面编译gdb的时候产生的,但由于gdb是在X86电脑上运行的,所以这个libgdnsupport.a库是x86格式的,

所以我要在重新配置编译一遍gdb,只不过这次配置要用下面的命令,要编译交叉编译的版本,但是不要make install,要是install那么前面编译的X86版本的gdb就被覆盖了,这一次其实不是为了编译gdb,只是为了使用编译gdb过程中产生的库,

tar xzvf gdb-13.2.tar.gz
cd ./gdb-13.2
./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc  CXX=arm-linux-gnueabihf-g++  AR=arm-linux-gnueabihf-ar LD=arm-linux-gnueabihf-ld 
make -j8  //这次gdb就不要安装了,要不然吧前面编译的覆盖了

然后再编译gdbserver

cd ./gdb-13.2/gdbserver
./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ AR=arm-linux-gnueabihf-ar LD=arm-linux-gnueabihf-ld --prefix=/data/chw/imx6ull_20230512/nfs_rootfs/gdbserver_install  //配置                     
make -j8

这时候就会在当前目录下生成一个gdbserver,把它拷贝到开发板上即可

然后在开发板上执行

然后电脑上执行

这说明自己编译出来的gdb和gdbserver也是可以用的。

2 VSCode+gdbserver 图形化调试

前面介绍的是用gdb命令进行调试的,接下来看一下直接用vscode调试,这样要比gdb命令方便。

先按照下面的博客安装必要的插件:ubuntu上安装vscode,并远程开发与远程调试服务器代码_vscode ssh远程连接ubuntu后,怎么打开项目代码-CSDN博客

我现在调试是这样的,我的vscode是安装在windows上的,然后我要调试的代码test.c是在ubuntu服务器上的,所以我要先vscode远程打开ubuntu服务器上的test.c代码,就根据上面链接的博客操作就可以,然后run--Add Configuration---

会生成一个launch.json,

把vscode里面的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": "(gdb) Launch",

            "type": "cppdbg",

            "request": "launch",

            "program": "${workspaceFolder}/test",

            "args": [],

            "stopAtEntry": false,

            "cwd": "${fileDirname}",

            "environment": [],

            "externalConsole": false,

            "MIMode": "gdb",

            "miDebuggerPath": "/data/chw/imx6ull_20230512/nfs_rootfs/gdb_install/bin/arm-linux-gnueabihf-gdb",

            "miDebuggerServerAddress": "172.31.8.195:1234"

        }

    ]

}

其中

  • miDebuggerPath:此项需要手动添加,用于指定所使用的交叉编译器 gdb 路径。 
  • miDebuggerServerAddress:此项需要手动添加,远程 gdbserver 服务器地址。 

然后开发板上还是老样子,运行gdbserver

然后vscode上直接按F5,然后开发板上打印出了被连接的log。

然后就可以在vscode上进行调试了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/135617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pandas - 数据合并

DataFrame数据合并主要使用merge()方法和concat()方法。 1.数据合并&#xff08;merge()方法&#xff09; Pandas模块的merge()进行数据合并时&#xff0c;两个DataFrame对象必须有相同的列。 1.常规合并 import pandas as pddf1 pd.DataFrame({编号:[mr001,mr002,mr003],语…

单片机程序无法下载?

原因一&#xff1a;电源问题 电源可能是导致STM32微控制器无法下载程序的一个常见原因。确保电源稳定对于正常运行和下载程序至关重要。以下是一些电源问题&#xff1a; 1. 电源电压不足&#xff1a;如果STM32微控制器没有足够的电压供应&#xff0c;它可能无法正常工作或下载程…

22款奔驰GLS450升级中规主机 实现导航地图 中文您好奔驰

很多平行进口的奔驰GLS都有这么一个问题&#xff0c;原车的地图在国内定位不了&#xff0c;语音交互功能也识别不了中文&#xff0c;原厂记录仪也减少了&#xff0c;使用起来也是很不方便的。星骏汇小许 Xjh15863 其实很简单&#xff0c;我们只需要更换一台中规的新主机就可以实…

华为政企网络安全产品集

产品类型产品型号产品说明 防火墙及应用安全网关ASG5505ASG5000系列上网行为管理产品&#xff08;以下简称“ASG5000”&#xff09;是华为面向各类企业、政府、大中型数据中心以及各类无线非经营性场所推出的业界领先的综合上网行为管理产品。 该系列产品可深度识别、管控和…

【数据结构】树与二叉树(六):二叉树的链式存储

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉…

Linux家目录变成了-bash-4.2$

Linux家目录变成了-bash-4.2$ Mark a workarround: 使用root用户&#xff0c;执行cp -a /etc/skel/. /home/zookeeper/&#xff08;不是root用户也可以&#xff09; 其中/home/zookeeper/目录是对应自己的家目录地址~ 若有帮到你&#xff0c;记得点赞&#xff0c;收藏呀…

『MySQL快速上手』-⑤-数据类型

文章目录 1.数据类型有哪些2.数值类型2.1 tinyint 类型2.2 bit 类型2.3 小数类型2.3.1 float2.3.2 decimal 3.字符串类型3.1 char3.2 varchar3.2 char 和 varchar 比较 4.日期和时间类型5.enum和set 1.数据类型有哪些 MySQL支持多种数据类型&#xff0c;这些数据类型可用于定义…

【AntDesign】Docker部署

docker部署是主流的部署方式&#xff0c;极大的方便了开发部署环境&#xff0c;保持了环境的统一&#xff0c;也是实现自动化部署的前提。 1 项目的目录结构 dist: 使用build打包命令&#xff0c;生成的打包目录 npm run build : 打包项目命令 docker: 存放docker容器需要修改…

Python爬虫-获取汽车之家车家号

前言 本文是该专栏的第9篇,后面会持续分享python爬虫案例干货,记得关注。 地址:aHR0cHM6Ly9jaGVqaWFoYW8uYXV0b2hvbWUuY29tLmNuL0F1dGhvcnMjcHZhcmVhaWQ9MjgwODEwNA== 需求:获取汽车之家车家号数据 笔者将在正文中介绍详细的思路以及采集方法,废话不多说,跟着笔者直接往…

MCU系统的调试技巧

MCU系统的调试技巧对于确保系统稳定性和性能至关重要。无论是在嵌入式系统开发的初期阶段还是在产品维护和优化的过程中&#xff0c;有效的调试技巧可以帮助开发人员快速发现和解决问题&#xff0c;本文将讨论一些MCU系统调试的技巧。 首先&#xff0c;使用调试工具是非常重要…

Push和Pull两种类型的消费者

根据使用者对读取操作的控制情况&#xff0c;消费者可分为两种类型。一个是DefaultMQPushConsumer&#xff0c;由系统控制读取操作&#xff0c;收到消息后自动调用传入的处理方法来处理&#xff1b;另一个是DefaultMQPullConsumer&#xff0c;读取操作中的大部分功能由使用者自…

[量化投资-学习笔记008]Python+TDengine从零开始搭建量化分析平台-CCI和ATR

目录 1. 指标简介CCIATR 2. 程序编写题外话 1. 指标简介 将这两个指标放在一起&#xff0c;一方面是因为这两个指标都属于摆动指数&#xff0c;可以反应市场的活跃度。 另一方面是因为CCI和ATR与之前提到的EMA,MACD,布林带的三个指标的计算基础不同。之前的三个指标都是以收盘…

RedisTemplate连接密码设置教程

最近在一个项目中使用Redis保存Token时&#xff0c;出现连接Redis报错的情况 org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to localhos…

智能交通和自动驾驶技术

一、定义 智能交通和自动驾驶技术是指利用先进的信息技术和人工智能技术&#xff0c;实现交通系统的智能化和自动化。智能交通和自动驾驶技术不仅可以提高交通系统的效率和安全性&#xff0c;还可以改善人们的出行体验&#xff0c;促进城市可持续发展。 智能交通和自动驾驶技…

AR眼镜硬件解决方案_AR/VR智能眼镜安卓主板芯片方案介绍

随着近两年来增强现实(AR)技术的逐渐成熟&#xff0c;采用MT8788芯片解决方案的AR眼镜已经问世。众所周知&#xff0c;AR技术可以帮助开发者打造一个既强大而又实用的混合现实世界&#xff0c;将虚拟与真实世界相结合。 据了解&#xff0c;MT8788芯片采用了多芯片分布式处理系统…

虚幻5.3打包Windows失败

缺失UnrealGame二进制文件。 必须使用集成开发环境编译该UE项目。或者借助虚幻编译工具使用命令行命令进行编译 解决办法&#xff1a; 1.依次点击平台-项目启动程序 2.点击后面的按钮进行设置 3.稍等后&#xff0c;打包后的程序即可运行&#xff0c;之后就可以愉快的打包了

电商API:淘宝京东拼多多1688多电商平台的商品销量库存信息获取

item_get 获得淘宝商品详情 获取APIkeyitem_get_pro 获得淘宝商品详情高级版item_review 获得淘宝商品评论item_fee 获得淘宝商品快递费用item_password 获得淘口令真实urlitem_list_updown 批量获得淘宝商品上下架时间seller_info 获得淘宝店铺详情item_search 按关键字搜索淘…

支持向量机 (SVM):初学者指南

照片由 Unsplash上的 vackground.com提供 一、说明 SVM&#xff08;支持向量机&#xff09;简单而优雅用于分类和回归的监督机器学习方法。该算法试图找到一个超平面&#xff0c;将数据分为不同的类&#xff0c;并具有尽可能最大的边距。本篇我们将介绍如果最大边距不存在的时候…

Android修行手册-实现利用POI将图片插入到Excel中(文末送书)

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

ZZ308 物联网应用与服务赛题第G套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 &#xff08;G卷&#xff09; 赛位号&#xff1a;______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等&#xff1b; 2.竞赛任务中所使用…