当前位置: 首页 > news >正文

Linux工具之gdb(含移植到arm-linux系统)

文章目录

  • 文件目录结构
  • 移植ncurses库
  • 移植gdb
  • 移植到arm板
  • 调试测试

linux主机:ubuntu-18.04

交叉编译器:arm-buildroot-linux-gnueabihf

开发板kernel:Linux 5.4.0-150-generic x86_64

开发板:100ASK_STM32MP157_PRO开发板

arm-linux的gdb移植分为两种情况,一种是交叉调试,一种是本地调试。

  • 交叉调试模式:需要编译一个arm-linux版本gdbserver (GDB的stub模块),然后再编译一个X86版本交叉调试的gdb,为了与桌面版本身的gdb 区别开来,一般改名为 arm-linux-gdb。两者通过串口或者网络进行互联。
  • 本地调试模式:这种模式把整个gdb移植成一个arm的本地版,直接在开发板上用gdb来调试。

两种调试模式的具体差异查看博文:arm-linux的gdb移植,交叉调试模式编译:嵌入式arm linux环境中gdb+gdbserver调试

本博文介绍本地调试模式

文件目录结构

按照移植规范,ncurse放入libs目录,gdb 解压在项目目录下

/home/book/Desktop/gdb (项目目录)
|
|--output
|      |-- arm-linux
|  
|-- gdb-7.6.1
|
|-- libs|-- ncurses-5.9.tar.gz

移植ncurses库

下载地址:http://ftp.gnu.org/gnu/ncurses/
下载版本: ncurses-5.9.tar.gz

进入下载目录,输入命令进行解压

tar -zxvf ncurses-5.9.tar.gz

进入解压后的目录

cd ncurses-5.9

生成Makfile

./configure --host=arm-buildroot-linux-gnueabihf --prefix=$PWD/output/arm-linux  --enable-termcap --with-shared --without-ada
  • –host表示交叉编译器的前缀,根据交叉编译器的不同需要进行更改
  • –prefix表示的是目标目录,即编译完成后生成的文件的位置
  • –enable-termcap比较关键,gdb需要这个库,
  • -with-shared表示动态编译

编译

make

报错:

In file included from ../ncurses/curses.priv.h:283,from ../ncurses/lib_gen.c:19:
_22148.c:835:15: error: expected ‘)’ before ‘int../include/curses.h:1594:56: note: in definition of macro ‘mouse_trafo’#define mouse_trafo(y,x,to_screen) wmouse_trafo(stdscr,y,x,to_screen)^
Makefile:794: recipe for target '../obj_s/lib_gen.o' failed
make[1]: *** [../obj_s/lib_gen.o] Error 1
make[1]: Leaving directory '/home/book/Desktop/gdb/ncurses-5.9/ncurses'
Makefile:109: recipe for target 'all' failed
make: *** [all] Error 2

解决方法:

进入ncurses-5.9/include文件夹,修改 curses.tail 文件:
将 extern NCURSES_EXPORT(bool)    mouse_trafo (int*, int*, bool);              /* generated */ 
改为 extern NCURSES_EXPORT(bool)    mouse_trafo (int*, int*, bool);
也就是去掉注释 /* generated */

安装

make install

以上操作成功后,会在libncurses.so.5 库应该在/home/hxy/gdb/output/arm-linux/lib可执行文件,libncurses.so.5就是我们要移植到arm板上的文件。

cp libncurses.so.5 /home/book/nfs_rootfs/

前提是使用nfs,或者使用其他工具移植到开发板中

移植gdb

下载gdb源代码:http://ftp.gnu.org/gnu/gdb/
下载版本: gdb-7.6.1.tar.gz

进入下载目录解压

tar -xvf gdb-7.6.1.tar.gz

进入解压目录

cd gdb-7.6.1

生成Makefile

./configure --host=arm-buildroot-linux-gnueabihf CC=/home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin/arm-buildroot-linux-gnueabihf-gcc --enable-shared --prefix=$PWD/output/arm-linux --disable-werror --without-x --disable-gdbtk --disable-tui --without-included-regex --without-included-gettext LDFLAGS="-L$PWD/../output/arm-linux/lib" CPPFLASS="-I$PWD/../output/arm-linux/include"
  • –enable-shared 动态编译
  • CC 是交叉编译器的绝对路径,为了避免找不到交叉编译器的错误
  • –without-x 取消x windows 支持
  • –disable-gdbtk 取消gdbtk,应该也是图形界面相关的
  • –disable-tui 取消tui 界面
  • –disable-werror 屏蔽werror报警
  • –without-included-regex 关闭正则表达式库
  • –without-included-gettext 去掉用于多语言处理的 gettext库。正则表达式/gettext暂时不需要
  • –host=arm-buildroot-linux-gnueabihf 用arm-buildroot-linux-gnueabihf编译
  • –prefix=“$PWD/output/arm-linux” 安装目录
  • "LDFLAGS=XXX"指定的是前面交叉编译完成的ncurse的lib目录的路径
  • "CPPFLAGS=XXX"指定的是前面交叉编译完成的ncurse的include目录的路径;

编译

make

安装

make install

最终的可执行程序gdb应该在/home/book/Desktop/gdb/output/arm-linux/bin下面

刚刚编译出来的gdb空间相当大,因此必须要用arm-buildroot-linux-gnueabihf-strip 来把空间减少

arm-buildroot-linux-gnueabihf-strip gdb

移植到arm板

将生成的动态库和可执行文件libncurses.so.5、gdb拷贝到arm板上,给予可执行权限

chmod +x libncurses.so.5 gdb

并将libncurses.so.5放在arm板的/usr/lib目录下

cp libncurses.so.5 /usr/lib

并将gdb放在arm板的/bin目录下

cp gdb /bin

调试测试

在Ubuntu环境下编写一个简单的C程序,命名为test.c,在Ubuntu环境下打开命令行进行交叉编译

arm-buildroot-linux-gnueabihf-gcc -g test.c -o test

将生成的可执行文件test拷贝到arm板上,给予可执行权限。然后进行gdb调试,

gdb test

参考博文:

将本地调试gdb移植到arm板

移植gdb到arm板

gdb移植到arm开发板

安装 arm-linux-gdb7.5 & 可能出现的两类问题解决

相关文章:

Linux工具之gdb(含移植到arm-linux系统)

文章目录 文件目录结构移植ncurses库移植gdb移植到arm板调试测试 linux主机:ubuntu-18.04 交叉编译器:arm-buildroot-linux-gnueabihf 开发板kernel:Linux 5.4.0-150-generic x86_64 开发板:100ASK_STM32MP157_PRO开发板 arm-…...

DolphinScheduler

参考 Apache DolphinScheduler v1.3.9 使用手册 内置组件 masterserverworkserverzookeepertask queuealertapiui 设计 去中心化设计 通过zk选举 UI功能 队列管理 Yarn调度器的资源队列 用户管理 租户对应的是Linux系统用户,是Worker执行任务使用的用户 用户…...

10大白帽黑客专用的 Linux 操作系统

平时在影视里见到的黑客都是一顿操作猛如虎,到底他们用的都是啥系统呢? 今天给大家分享十个白帽黑客专用的Linux操作系统。 ▍1. Kali Linux Kali Linux是最著名的Linux发行版,用于道德黑客和渗透测试。Kali Linux由Offensive Security开发&…...

Golang每日一练(leetDay0099) 单词规律I\II Word Pattern

目录 290. 单词规律 Word Pattern 🌟  291. 单词规律 II Word Pattern ii 🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 …...

linux_centos7.9/ubuntu20.04_下载镜像及百度网盘分享链接

1、镜像下载站点 网易开源镜像:http://mirrors.163.com/ 搜狐开源镜像:http://mirrors.sohu.com/ 阿里开源镜像:https://developer.aliyun.com/mirror/ 首都在线科技股份有限公司:http://mirrors.yun-idc.com/ 常州贝特康姆软件技…...

Reqable HTTP一站式开发+调试工具(小黄鸟作者另一力作、小黄鸟完美替代品)

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!Reqable HTTP一站式开发+调试工具(小黄鸟作者另一力作、小黄鸟替代品) 环境 win10pixel4Android13概览 …...

Yacc 与 Lex 快速入门

Yacc 与 Lex 快速入门 简介: Lex 和 Yacc 是 UNIX 两个非常重要的、功能强大的工具。事实上, 如果你熟练掌握 Lex 和 Yacc 的话,它们的强大功能使创建 FORTRAN 和 C 的编译器如同儿戏。本文详细的讨论了编写自己的语言和编译器所 用到的这两…...

【开源与项目实战:开源实战】80 | 开源实战二(下):从Unix开源开发学习应对大型复杂项目开发

上两节课,我们分别从代码编写、研发管理的角度,学习了如何应对大型复杂软件开发。在研发管理这一部分,我们又讲到比较重要的几点,它们分别是编码规范、单元测试、持续重构和 Code Review。其中,前三点在专栏的理论部分…...

【单周期CPU】LoongArch | 立即数扩展模块Ext | 32位算术逻辑运算单元(ALU)

前言:本章内容主要是演示在vivado下利用Verilog语言进行单周期简易CPU的设计。一步一步自己实现模型机的设计。本章先介绍单周期简易CPU中基本组合逻辑部件的设计。 💻环境:一台内存4GB以上,装有64位Windows操作系统和Vivado 201…...

Python实现数据结构的基础操作

目录 一、列表(List) 二、字典(Dictionary) 三、集合(Set) 四、链表的实现 五、队列和栈 数据结构是计算机科学中非常重要的概念,它用于存储和组织数据以便有效地进行操作。Python作为一种…...

20230624----重返学习-vue-响应式处理思路-仿源码

day-098-ninety-eight-20230624-vue-响应式处理思路-仿源码 vue vue大体概念 Vue是渐进式框架 所谓渐进式框架,就是把一套全面的框架设计体系,拆分成为多个框架,项目中需要用到那些需求,再导入对应的框架,以此来保证…...

【MongoDB】三、使用Java连接MongoDB

【MongoDB】三、使用Java连接MongoDB 实验目的实验内容练习1、开启Eclipse,创建Java Project项目,命名为Mongo12、添加项目依赖的jar包3、创建类MongoDemo4、连接数据库5、查看集合6、创建集合7、删除集合8、查看文档9、插入文档10、更新文档11、删除文档…...

【C++】通讯录的基本实现,附有源码分享

目录 1、运行环境 2、系统实现功能 2.1菜单功能 2.2退出通讯录功能 2.3添加联系人功能 2.4显示联系人功能 2.5删除联系人功能 2.6查找联系人功能 2.7修改联系人功能 2.8清空联系人功能 2.9动态扩容功能 2.10选择优化功能 2.11文件操作 3、源码分享 1、运行环境 …...

UI 自动化测试 —— selenium的简单介绍和使用

selenium 是 web 应用中基于 UI 的自动化测试框架,支持多平台、多浏览器、多语言。 提到 UI 自动化就先了解什么是自动化测试? 目录 1. 自动化测试 2. UI 自动化 2.1 UI 自动化的特点 2.2 UI 自动化测试的优缺点 2.3 UI 自动化测试的使用对象 2.4…...

mybatisPlus中apply的使用以进行联表等复杂sql语句

在 MyBatis-Plus 中,apply() 方法可以用于添加任意的 SQL 片段,包括联表查询。因此,你可以使用 apply() 方法来处理各种类型的联表查询。 使用 apply() 方法的好处是可以在查询条件中直接添加原生的 SQL 片段,而不受 MyBatis-Plu…...

自学Python技术的方法

目录 一、Python技术介绍 二、学习前的准备工作 三、学习时的具体操作 四、如何巩固学习 Python是一种高级编程语言,被广泛用于软件开发、数据分析、人工智能和科学计算等领域。它于1991年由Guido van Rossum创建,并且其简洁、易读的语法以及丰富的标…...

python熟悉python基础语法,了解html网络结构,了解json格式数据,含有字符串

前言 Python网络爬虫是利用Python编写的程序,通过自动化地访问网页、解析html或json数据,并提取所需信息的技术。下面将详细介绍一些与Python网络爬虫相关的重要知识点。 1、Python基础语法: 变量和数据类型:学习如何声明变量以及…...

linux mail -s发送邮件异常解决

异常: Error initializing NSS: Unknown error -8015. "/root/dead.letter" 11/301 . . . message not sent. 出现此问题,大概率是和证书相关。如果没有安装证书,请先安装: 1,下载 yum -y install mailx …...

Netty核心技术七--Google Protobuf

1.编码和解码的基本介绍 编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据时就需要解码 codec(编解码器) 的组成部分有两个:decoder(解码器)和encoder(编码器)。encoder 负责把…...

【Docker】Docker常用命令总结

文章目录 一、帮助命令二、镜像命令三、容器命令四、常用的其他命令 在开发过程中,经常涉及到 docker 的相关操作,本文对常用的指令进行汇总。 一、帮助命令 docker version # 显示docker版本信息 docker info # 显示docker系统信息&#xff…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...