当前位置: 首页 > 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…...

React 对比class与Effect Hook优化响应式数据更新监听,感受useEffect真正的强大

还是之前写过的一个组件 import React from "react"export default class index extends React.Component{constructor(props){super(props);this.state {name: "小猫猫"}}componentDidMount ()>{document.title this.state.name;}componentDidUpda…...

AWS Lambda 介绍

计算服务的演进 EC2------Container-------Lambda 虚拟机---容器--------------serverless无服务器架构 什么是AWS Lambda? AWS lambda的核心是事件驱动,驱动可能来自,Alexa,SNS,DynamoDB,S3,Kinesis等&…...

linux之权限管理

目录 1.一.基本小语句 2.文件权限操作chmod 1.一.基本小语句 ls - a 查看此文件夹所有和隐藏内容 ls - l 查看此文件夹权限 chown 改变文所有者 2.文件权限操作chmod chmod 参数 文件名 文件的权限主要针对三类对象进行定义   owner 属主, u:针对前三个部分的权限修改   …...

【设计模式与范式:行为型】61 | 策略模式(下):如何实现一个支持给不同大小文件排序的小程序?

上一节课,我们主要介绍了策略模式的原理和实现,以及如何利用策略模式来移除 if-else 或者 switch-case 分支判断逻辑。今天,我们结合“给文件排序”这样一个具体的例子,来详细讲一讲策略模式的设计意图和应用场景。 除此之外&…...

【C++】auto_ptr为何被唾弃?以及其他智能指针的学习

搭配异常可以让异常的代码更简洁 文章目录 智能指针 内存泄漏的危害 1.auto_ptr(非常不建议使用) 2.unique_ptr 3.shared_ptr 4.weak_ptr总结 智能指针 C中为什么会需要智能指针呢?下面我们看一下样例: int div() {int a, b;cin >&g…...

数据结构练习题1:基本概念

练习题1:基本概念 1 抽象数据类型概念分析2. 逻辑结构与存储结构概念分析3.综合选择题4.综合判断题5.时间复杂度相关习题6 时间复杂度计算方法(一、二、三层循环) 1 抽象数据类型概念分析 1.可以用(抽象数据类型)定义…...

如何消除Msxml2.XMLHTTP组件的缓存

之前使用这个组件,是每隔十分钟取数据,没有遇到这个缓存问题, 这次使用它是频繁访问接口,就出现了一直不变的问题。觉得是缓存没有清除的问题。 网上搜了一些方案。最好的方案就是给url地址末尾给一个随机参数。用于让组件觉得是…...

深入理解Java虚拟机jvm-运行时数据区域(基于OpenJDK12)

运行时数据区域 运行时数据区域程序计数器Java虚拟机栈本地方法栈Java堆方法区运行时常量池直接内存 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的…...

(OpenCV) 基础demo

文章目录 前言Demo图片录制播放人脸识别 END 前言 OpenCV - Open Computer Vision Library OpenCV的名声想必不用多说了。 本文介绍4个基础使用demo。分别为,显示图片,录制视频,播放视频和一个基于开源算法库的人脸识别小demo。 只要环境…...

using 的使用

作者: 苏丙榅 链接: https://subingwen.cn/cpp/using/ 在 C 中 using 用于声明命名空间,使用命名空间也可以防止命名冲突。在程序中声明了命名空间之后,就可以直接使用命名空间中的定义的类了。在 C11 中赋予了 using 新的功能,让C变得更年轻…...

网站在线支付方案/什么样的人适合做策划

1.应用场景 主要用于定义和运行多容器 Docker 应用程序,提高工作效率~ 2.学习/操作 1.文档阅读 Docker Compose | 菜鸟教程 // Docker Compose -- 入门了解 Overview of Docker Compose | Docker Documentation // docker官网 Install Docker Compose |…...

自己做企业网站好做吗/谷歌推广教程

java.lang.Collections 此类完全由在collection上进行操作或返回 collection 的静态方法组成。也就是说Collections提供了对Collection集合操作的一些方法。jdk类似这种的还有几个,例如:Array和Arrays,Object和Objects。 Collections类没有子…...

免费域名网站的/百度新闻搜索

前言当需要将较大的数据上传到服务器,或从服务器下载较大的日志文件时,往往会因为网络或其它原因而导致传输中断而不得不重新传输。这种情况下,可以先将大文件分割成小文件后分批传输,传完后再合并文件。1. 分割文件文件分割可以使…...

九江网站制作/重庆优化seo

题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置为指数,以 1010 为底数的幂之和的形式。例如 123123 可表示为 110221013100110221013100 这样的形式。 与之相似的,对二进制数来说,也可表示成每个二进制数…...

网站首页被降权/谷歌浏览器下载手机版官网

https://blog.csdn.net/zhao_teng/article/details/104669281/...

做网站不难吧/百度云盘登录电脑版

密码学C/C语言实现学习笔记——Rijndael实现预定义: #define MAXCKEY 8 /* Maximum length of user key in 4-byte words */用户密钥最大长度,以4字节为单位,最长256比特#define MAXNCOL 8 /* Maximum blocklength …...