嵌入式 程序调试之gdb和gdbserver的交叉编译及使用

news2024/12/23 22:29:02

                              嵌入式 程序调试之gdb和gdbserver的交叉编译及使用

一、简述

       记--交叉编译gdb、gdbserver并调试嵌入式程序。

       gdb是功能非常强大的常用调试工具,可以直接下断点进行单步调试,是差错排错的利器。

 常见三种不同使用场景的gdb:

       x86 pc端gdb(以下简称x86-pc-gdb), 是直接运行再x86 PC端的,比如调试 在ubuntu系统的gcc编译出来的程序,在开发pc端程序的时候就是使用该gdb。

       交叉编译工具链gdb(pc端)(以下简称arm-pc-gdb):交叉编译工具链编译出来的嵌入式程序就是放在嵌入式设备上运行的程序,交叉编译工具链的gdb是在pc端上调试嵌入式程序产生的coredump文件,以及搭配gdbserver使用的。

       交叉编译工具链编译得到的gdb(以下简称arm-gdb):就是能直接在嵌入式设备上运行的gdb。交叉编译工具链编译得到的gdbserver(以下简称arm-gdbserver):就是能直接在嵌入式设备上运行的gdbserver。

       相关源码下载:外链:https://wwm.lanzouv.com/b0cb5qtla 密码:bnw

二、使用场景

调试嵌入式程序会使用到交叉编译工具链gdb(以下简称arm-pc-gdb)、交叉编译工具链编译得到的gdb(以下简称arm-gdb)、交叉编译工具链编译得到的gdbserver(以下简称arm-gdbserver)

arm-pc-gdb包含在交叉编译工具链套件中,交叉编译工具链由相关厂家系统提供,或从网上获取。arm-gdb,arm-server需要自己下载gdb源码,使用交叉编译工具链进行编译,编译后会得到arm-gdb, arm-server。arm-gdb一般有几十M,而gdbserver只有几百kb。

使用场景:

1、嵌入式程序崩溃,得到coredump文件,可以直接使用arm-pc-gdb coredump文件进行调试或查看崩溃信息,通常会输入bt指令进行查看栈信息。

2、想要直接调试程序,有的嵌入式程序有相关硬件操作的,所以需要在实际环境上运行才能调试,此时需要arm-gdb,直接将arm-gdb放到嵌入式设备中,然后就跟在pc端使用gdb一样进行调试嵌入式程序。那arm-gdbserver是怎么使用的呢?它是搭配arm-pc-gdb使用的,也就是arm-gdbserver和嵌入式程序在嵌入式设备上运行,嵌入式设备通过网络或其它通道连接到PC机,由PC端的arm-pc-gdb进行实际调试嵌入式程序。可以简单理解为arm-gdbserver就是一个转发作用,为什么要"多次一举"呢?直接使用arm-gdb调试不是更加简单直接吗?原因如下:

a) 通常嵌入式设备是没有源码的,(把源码传输过去?不可取,而且有时候设备是在客户手中),直接使用arm-gdb调试程序时可能只能看到源码文件名和行数,不能直接或不能实时的查看源码,通过arm-gdbserver转发到有源码的的PC端,调试更加方便。

b)通常嵌入式设备的存储空间都是有限的或需要控制成本尽量减少非必须非用户功能的使用, 所以嵌入式设备不会过多移植相关工具,毕竟嵌入式设备是要满足用户需求,而不是搭建完备的调试环境。arm-gdbserver体积比arm-gdb小的多,且在PC端调试,相关的调试工具更加齐全。

c)在pc端可以搭配使用IDE进行可视化,使得调试更加直观方便有效。比如在PC端使用gdb+vscode,可以直接在指定源码行下断点,直接调试,可以实时查看当前内存变量、寄存器,堆栈等信息,是arm-gdb无法比拟的。

三、交叉编译gdb和gdbserver

      3.1 下载gdb源码,注:如果需要使用gdbserver, 最好保持跟arm-pc-gdb一样的版本,否则可能会有兼容性问题。

下载连接:http://ftp.gnu.org/gnu/gdb/

 3.2 解压并编译

 解压源码到当前目录:tar xvf gdb-7.5.tar.gz

得到gdb-7.5目录

 创建一个目录用来存放编译得到的gdb,gdbserver:mkdir gdb7.5-arm_build

执行以下指令进行进行配置:

./configure --prefix=/home/liang/gdb-7.5/gdb7.5-arm_build --host=arm-linux CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ LD=arm-linux-gnueabihf-ld AR=arm-linux-gnueabihf-ar

 其中--prefix=/home/liang/gdb-7.5/gdb7.5-arm_build指定编译生成的可执行存放路径

执行编译: 

make -j8 && make  install

编译完成:

将gdb、gdbserver传输到嵌入式设备即可使用,进行调试嵌入式程序。

四、测试使用gdb和gdbserver 

 4.1 测试代码

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
	int i;
	printf("Hello gdb\n");
	for (i = 0; i < 5; i++) {
		printf("i=%d\n", i);
	}
	while(i < 10) {
		sleep(1);
	}
	printf("I am exit\n");
	return 0;
}

 4.2 编译测试代码得到可执行文件test1:arm-linux-gnueabihf-gcc test1.c -o test1 -g

注意需要添加-g选项,添加调试信息。

4.3 将测试程序传输到嵌入式设备进行测试

4.3.1 gdb的使用:

 

 按q退出gdb调试。

4.3.2  gdbserver的使用:注意需要pc端跟嵌入式设备能进行通信,这里使用的是无线网络。

嵌入式设备端:gdbserver先启动, 其中12345是网络通讯端口,自行指定,gdb连接时需要对应上。

 pc端(ubuntu):启动arm-linux-gnueabihf-gdb ./test1  (test1需要跟gdbserver启动的程序是同一个)

有源码test1.c才能list出来,否则调试时只有文件名跟行号。

 

4.3.3 arm-linux-gnueabihf-gdb直接调用coredump文件

测试代码:

#include <stdio.h>

int main(int argc, char *argv[])
{
	char *p = NULL;
	printf("Hello gdb\n");
	*p = 100;
	printf("I am exit\n");
	return 0;
}

注意:默认系统可能不会产生coredump文件,需要自行设置。

执行:arm-linux-gnueabihf-gdb ./test1 coredump文件

 

 

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

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

相关文章

MyBatis ---- 自定义映射resultMap

MyBatis ---- 自定义映射resultMap1. resultMap处理字段和属性的映射关系2. 多对一映射处理a>级联方式处理映射关系b>使用association处理映射关系c>分布查询3. 一对多映射处理a>collectionb>分步查询1. resultMap处理字段和属性的映射关系 当实体类中的属性名…

一文详解数据链路相关技术

一文详解数据链路相关技术1.MAC地址2.共享介质型网络争用方式令牌传递3.非共享介质网络4.环路检测技术生成树方式源路由法5.VLAN1.MAC地址 MAC地址直译为媒体存取控制位址&#xff0c;也称为局域网地址&#xff08;LAN Address&#xff09;&#xff0c;MAC位址&#xff0c;以太…

云服务器使用及Linux基本命令

文章目录前言一、Linux1.Linux发现版本2.Linux环境搭建方式云服务器使用终端软件连接Linux3.Linux基础命令&#xff08;1&#xff09;ls:列出该目录下的所有子目录与文件。&#xff08;2&#xff09;pwd&#xff1a;显示当前所在用户&#xff08;3&#xff09;cd &#xff1a;改…

终于来了

程序员求职简历&#xff0c;项目经验怎么写&#xff1f;免费修改简历、提供模板并内部推荐昨天我还在说"三年了&#xff0c;乌云还未散尽&#xff0c;仿佛若有光"。今天一大早&#xff0c;光就照进来了。深圳卫健委宣布公交、地铁、药店、公园、旅游景点等场所都不需…

数据结构(王卓)(4)附:链表的销毁与清空

销毁 Status 销毁单链表(LinkList L) {LinkList p;while (L){p L;L->next;delete p;}return OK; } 运行逻辑&#xff1a; &#xff08;1&#xff09;:设定一个指针&#xff0c;让指针指向链表的头指针L &#xff08;2&#xff09;&#xff1a;让头指针等于头指针里面指向下…

Session和Cookie

回顾 1.Servlet API 2.HttpServlet DoXXX处理哪种Http方法会调用到对应的方法 init/destroy/service—>servlet的生命周期 3.HttpServletRequest Http请求 get系列方法 协议名&#xff08;版本号&#xff09; url query string header query String/body HttpServletRespon…

【配准和融合相互作用,交互】

RFNet: Unsupervised Network for Mutually Reinforcing Multi-modal Image Registration and Fusion &#xff08;RFNet&#xff1a;一种互增强的多模态图像配准与融合的无监督网络&#xff09; 本文提出了一种在相互增强的框架RFNet中实现多模态图像配准与融合的新方法。我们…

第八章 集成学习

8.1 个体与集成 集成学习通过构建并结合多个学习器来完成学习任务&#xff0c;有时也被称为多分类系统、基于委员会的学习等。 下图显示出集成学习的一般结构&#xff1a;先产生一组个体学习器&#xff0c;再用某种策略将它们结合起来。个体学习器通常由一个现有的学习算法从训…

Redis实战——分布式锁

目录 1 一人一单并发安全问题 2 分布式锁的原理和实现 2.1 什么是分布式锁&#xff1f; 2.2 分布式锁的实现 1 一人一单并发安全问题 之前一人一单的业务使用的悲观锁&#xff0c;在分布式系统下&#xff0c;是无法生效的。 理想的情况下是这样的&#xff1a;一个线程成功…

计算机中数的表示和运算

定点数 编程时需要确定小数点位置难以表示两个大小相差较大的数存储空间利用率低 这种用二进制来表示十进制的编码方式&#xff0c;叫作BCD 编码&#xff08;Binary-Coded Decimal&#xff09;。 浮点数 小数点的位置可以左右移动的数 规格化浮点数: IEEE 754规格化的尾数…

基于Java+Swing+Mysql实现《黄金矿工》游戏

基于JavaSwingMysq实现《黄金矿工》游戏一、系统介绍二、功能展示三、其他系统一、系统介绍 《黄金矿工》游戏是一个经典的抓金子小游戏&#xff0c;它可以锻炼人的反应能力。。该游戏中&#xff0c;可以通过“挖矿”获得积分&#xff0c;游戏道具&#xff1a;有3瓶药水&#…

cubeIDE开发, 如何结合FreeRTOS开发STM32程序

一、STM32CubeIDE使用内置的FreeRTOS 不同于STM32CubeIDE使用像RTThread这些第三方物联网系统&#xff0c;STM32CubeIDE在安装时就已经在MiddleWare中间件一栏直接支持了FreeRTOS操作系统。 既然STM32CubeIDE已经把FreeRTOS深度整合到了自家的系统中&#xff0c;所以移植及使用…

深度学习中的正则化——L1、L2 和 Dropout

正则化是一组技术&#xff0c;可以防止神经网络中的过度拟合&#xff0c;从而在面对来自问题域的全新数据时提高深度学习模型的准确性。 在本文中&#xff0c;我们将介绍最流行的正则化技术&#xff0c;称为 L1、L2 和 dropout。 文章目录1. 回顾&#xff1a;过拟合2.什么是正则…

【并发编程】AQS ReentrantLock 底层实现原理

一、概述 synchronized上锁机制是通过对象头来实现的&#xff0c;通过锁升级的过程来完成加锁。&#xff08;https://blog.csdn.net/zhangting19921121/article/details/106002751&#xff09; 但是synchronized锁升级的过程犹如一个黑盒&#xff0c;我们无法掌控。因此&…

常见的损失函数

1. 损失函数、代价函数与目标函数 损失函数&#xff08;Loss Function&#xff09;&#xff1a;是定义在单个样本上的&#xff0c;是指一个样本的误差。   代价函数&#xff08;Cost Function&#xff09;&#xff1a;是定义在整个训练集上的&#xff0c;是所有样本误差的平均…

07_openstack之安全组与浮动IP

目录 一、环境准备 二、浮动IP 1、浮动IP介绍 2、创建和分配浮动IP 三、安全组 1、安全组介绍 2、创建安全组 3、给云主机绑定安全组 一、环境准备 部署openstack私有云环境&#xff1a;02_openstack私有云部署_桂安俊kylinOS的博客-CSDN博客 创建项目和用户&#xf…

Mac电脑系统降级至10.15 Catalina(2020末代intel)

目录起因前期准备降级系统步骤&#xff08;联网&#xff09;选定开机阶段需要按的快捷键进入简化的macOS激活锁页面macOS实用工具页面抹除磁盘安装降级系统Catalina关于从U盘重装系统相关参考博客起因 这部分碎碎念可以不看> < 20年7月买mac是为了找工作&#xff0c;找到…

[附源码]计算机毕业设计校园商铺Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]计算机毕业设计药品仓库及预警管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

libcef.dll文件丢失怎么办?丢失对电脑有什么影响?

提到电脑中的系统文件可能大家都是不太了解的&#xff0c;毕竟平时使用电脑的时候也接触不到那些复杂的文件&#xff0c;最多大家只会使用电脑上面的各种功能&#xff0c;不过虽然接触不到但是大家也要适当的了解一下&#xff0c;就比如libcef.dll文件丢失了就会造成电脑系统出…