搭建嵌入式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, or
         any 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 of
         using a buggy 'make' (AIX, DU, IRIX), in which case you might
         want 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上进行调试了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第十八章:Swing自述

18.1 Swing概述 18.2&#xff1a;Swing常用窗体 18.2.1&#xff1a;JFrame窗体 package eightth; import java.awt.*; //导入AWT包 import javax.swing.*; //导入Swing包 public class JFreamTest { public static void main(String args[]) { // 主方法 JFr…

阿里云99元服务器2核2G3M带宽_4年396元_新老用户均可

阿里云2核2G3M带宽99元服务器新老用户同享&#xff0c;续费不涨价&#xff0c;99元即可续费&#xff0c;可以续费到2027年&#xff0c;相当于396元买4年&#xff0c;阿里云百科aliyunbaike.com来详细说下阿里云99元服务器配置、购买条件、优惠价格和续费攻略&#xff1a; 阿里…

计算机毕业设计 基于SpringBoot的私人西服定制系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【Python】Python爬虫使用代理IP的实现

前言 在爬虫的过程中&#xff0c;我们经常会遇到需要使用代理IP的情况。比如&#xff0c;针对目标网站的反爬机制&#xff0c;需要通过使用代理IP来规避风险。因此&#xff0c;本文主要介绍如何在Python爬虫中使用代理IP。 一、代理IP的作用 代理IP&#xff0c;顾名思义&…

flutter生态一统甜夏 @Android @ios @windowse @macos @linux @Web

(愿景)G o o g l e 中 国flutter生态一统天下(IT) @Web

网络安全入门必学内容

网络安全入门 必/学/内/容/ 随着时代的发展&#xff0c;经济、社会、生产、生活越来越依赖网络。而随着万物互联的物联网技术的兴起&#xff0c;线上线下已经打通&#xff0c;虚拟世界和现实世界的边界正变得模糊。这使得来自网络空间的攻击能够穿透虚拟世界的边界&#xff0…

YashanDB发布会圆满收官,V23.1三大新品引领国产数据库技术与应用突破!

11月8日&#xff0c;YashanDB 2023年度产品发布会在线上成功召开。本次产品发布会以“惟实励新”为主题&#xff0c;宣布崖山数据库系统YashanDB 内核能力、产品形态、生态创新全面升级&#xff0c;标志着YashanDB商业化进程又迈出了重要一步&#xff01; 据了解&#xff0c;深…

企业电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

java数据结构(红黑树)set集合 HashSet HashSet三个问题 LinkedHashSetTreeSet TreeSet集合默认规则排序规则

目录 数据结构(红黑树)红黑规则红黑树添加结点规则 set集合小结HashSet HashSet三个问题LinkedHashSet小结 TreeSetTreeSet集合默认规则排序规则(第一种排序方法)方式二练习 小练 总结总结 集合的使用应该怎么选择 数据结构(红黑树) 红黑规则 后代节点就是比如13根结点 13下面的…

opengauss权限需求

创建角色 "u_rts" 并授予对数据库 "rts_opsdb" 的只读权限&#xff1a; CREATE ROLE u_rts LOGIN PASSWORD Cloud1234; GRANT CONNECT ON DATABASE rts_opsdb TO u_rts; GRANT USAGE ON SCHEMA public TO u_rts; GRANT SELECT ON ALL TABLES IN SCHEMA pub…

网络安全(黑客)-零基础自学

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全…

10-26 maven配置

打开idea 打开setting 基于Idea创建idea项目 加载jar包&#xff1a;(一般需要自己去手动加入&#xff0c;本地仓库是没有的)

Spring Cloud - 通过 Gateway webflux 编程实现网关异常处理

一、webflux 编程实现网关异常处理 我们知道在某一个服务中出现异常&#xff0c;可以通过 ControllerAdvice ExceptionHandler 来统一异常处理&#xff0c;即使是在微服务架构中&#xff0c;我们也可以将上述统一异常处理放入到公共的微服务中&#xff0c;这样哪一个微服务需要…

计算机网络基础知识1

1、tcp三次握手&#xff1f; SYN&#xff0c;标志位&#xff0c;用于建立TCP连接的握手过程中的标志位。 ACK&#xff0c;确认位&#xff0c;用于说明整个包是确认报文。 TCP/IP协议是传输层的一个面向连接提供可靠安全的传输协议。第一次握手有客户端发起&#xff0c;客户端向…

【EI会议征稿】第四届计算机网络安全与软件工程国际学术会议(CNSSE 2024)

第四届计算机网络安全与软件工程国际学术会议&#xff08;CNSSE 2024&#xff09; 2024 4th International Conference on Computer Network Security and Software Engineering 第四届计算机网络安全与软件工程国际学术会议&#xff08;CNSSE 2024&#xff09;将于2024年2月…

使用 Rust 进行程序

首先&#xff0c;我们需要安装必要的库。在终端中运行以下命令来安装 scraper 和 reqwest 库&#xff1a; rust cargo install scraper reqwest 然后&#xff0c;我们可以开始编写程序。以下是一个基本的爬虫程序&#xff0c;用于爬取 上的图片&#xff1a; rust use reqwe…

【redis】ssm项目整合redis,redis注解式缓存及应用场景,redis的击穿、穿透、雪崩的解决方案

一、整合redis redis是nosql数据库&#xff0c;mysql是sql数据库&#xff0c;都是数据库因此可以参考mysql整合ssm项目的过程。 1.pom依赖 <properties> <redis.version>2.9.0</redis.version><redis.spring.version>1.7.1.RELEASE</redis.spri…

朋友圈延迟评论,你用过吗?

在社交媒体时代&#xff0c;朋友圈已经成为人们交流和互动的重要平台。然而&#xff0c;在发表评论时&#xff0c;我们往往会被情绪冲昏头脑&#xff0c;或者因为时间紧迫而没有充分思考。这可能会导致一些不恰当的言论&#xff0c;或者错过一些更精准的表达方式。朋友圈延迟评…

在外包干了3年,彻底废了...

前言 先简单说下&#xff0c;我18年的大专生&#xff0c;通过校招去了一家软件公司&#xff0c;在里面干了快3年的功能测试&#xff0c;后面我感觉自己不能够在这样下去了&#xff0c;长时间重复性工作且呆在一个舒适的环境会毁掉一个人&#xff0c;而我已经在一个企业干了3年…

Android Studio(列表视图ListView)

前言 前面在适配器章节&#xff0c;已经介绍了ListView的作用(干什么的)&#xff0c;这节将主要介绍如何去设计ListView页面视图。 思考 列表视图需要些什么&#xff1f; 1. 列表项容器&#xff08;装载各列表项的容器&#xff09;&#xff1a;<ListView/> 2. 列表项布局…