GDB调试-从安装到使用

news2024/11/15 11:11:30

1、GDB简介

  gdb 工具是 GNU 项目调试器,基于命令行。和其他的调试器一样,我们可以使用 gdb 来一行行的运行程序、单步执行、跳入/跳出函数、设置断点、查看变量等等,它是 UNIX/LINUX 操作系统下强大的程序调试工具。对于一般的Linux桌面系统(例如,ubuntu、centos等),我们可以直接运行gdb来调试程序。

2、GDB源码下载编译和安装

  Linux的各种发行版本一般默认安装有gdb,如果系统上没有安装可以使用以下方法进行安装。
  我们可以在gdb的官网上获取源码,地址为http://www.gnu.org/software/gdb/download/,下载源码gdb-11.2.tar.xz(这里使用的是此版本,其他版本可按需求自行挑选),下载完成后,上存到Ubuntu进行解压:解压命令如下

tar -xvf gdb-11.2.tar.xz	//默认解压到当前文件夹下

![在这里插入图片描述](https://img-blog.csdnimg.cn/f497ef504d9e45e99a2c7d89942d3e48.png

  解压后该文件包含了gdb和gdbserver的源码,如上图所示

3、本机直接安装

//进入到解压后的目录
cd gdb-11.2
//在gdb-11.2目录下生成Makefile文件
//输入命令
./configure
//进行编译
make
//编译完成后 进行安装
make install
//以上过程全是安装默认参数执行编译和安装,可在本机直接使用,如需更改配置和路径,可按一下步骤。
//查看是否安装成功
gdb -v

在这里插入图片描述

  出现相应版本号即安装成功

4、使用方法

  首先编译可执行程序的时候需要加上-g参数,例如:

gcc test.c -g -o test

  此二进制程序test可以直接通过gdb单步调试或直接运行

gdb ./test
//相关命令
r //全速运行
b //增加断点
c //运行到断点函数
s //进入断点函数
u //行号   跳出for循环到指定行
n //单步执行
p buff  //打印相关变量
p sizeof(结构体变量)  //查看结构体占用空间大小
bt //查看堆栈情况使用

  如果二进制程依赖其他库文件

gdb过程中
info sharedlibrary 查看依赖的库文件
看是否找的到
如果找不到将库文件拷贝到其查找路径,或者修改gdb动态搜索路径
命令如下
set sysroot  /home/test/arm_lib

在这里插入图片描述

  此外也可通过进程号或core文件进行调试

//调试进程
gdb -p 进程号 //调试单个进程
//调试core文件
gdb ./可执行程序  core文件

4.1、生成core文件设置

  程序异常退出时,内核会生成一个core文件(是内存映像以及调试信息)。可以通过使用gdb来查看core文件,指示出导致程序出错的代码所在的文件和行数。使用ulimit -c命令可查看core文件的生成开关,若结果为0,则便是关闭了此功能,不会生成core文件。
  设置core空间最大值

ulimit -a//查看core文件或有资源
ulimit -c 大小//设置core文件生成的大小
ulimit -c unlimited //则标识此core文件的大小不受限制
同名core文件新生成的会覆盖旧core文件

  设置core生成路径和名字

//修改文件命令: 
echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
echo "/root/core-%e-%t" > /proc/sys/kernel/core_pattern
%p -添加pid(进程id)
%u - 添加当前uid(用户id)
%g - 添加当前gid(用户组id)
%s - 添加导致产生core的信号
%t -添加core文件生成时的unix时间
%h - 添加主机名
%e -添加导致产生core的可执行程序名

5、gdb移植到嵌入式设备

  在此需要先了解configure相关参数

--build参数是指你编译源码包的系统环境,可以通过查看系统的环境变量来获取,执行set命令可以看到  MACHTYPE=i686-pc-linux-gnu,则--build=i686-pc-linux-gnu(可以不设置该参数,保持默认即可)
 一般情况一般情况下可以不用指定默认即可
 
--host参数指的是编译出来的工具运行在什么系统上,我编译出来的gdb是要运行在arm-linux开发板上,工具链为arm-none-linux-gnueabi
指目标文件运行的平台,一般填入交叉编译链前缀

--target参数指的是编译出的工具所要操作的系统,这个必须要理解明白,比如说我编译出来的gdb要在我的电脑上运行,但是要调试交叉编译出来的arm设备程序,这个时候呢,--target就是arm-none-linux-gnueabi,但是--host是i686-pc-linux-gnu
此参数会将生成目标文件名前缀 带上target所指的的前缀一般情况请下可以不用指定

--program-prefix=PREFIX该参数指定编译后文件安装的目录
--prefix=/xxx/xxx
如果不指定prefix,则可执行文件默认放在/usr/local/bin,
库文件默认放在/usr/local/lib。
配置文件默认放在/usr/local/etc
其他资源文件放在/usr/local/share
卸载这些程序需要在生成Makefile目录下用
make uninstall即可(与make install)操作相反
要么一个一个去手动删除

  因为gdb需要应用到ncurses相关库 因此需要先交叉编译此库。下载地址:http://ftp.gnu.org/gnu/ncurses/

相关参数和路径可按上述自行修改,此处可做参考
(1)tar -zxvf ncurses-5.9.tar.gz //解压到当前目录下
(2)cd ncurses-5.9 //进入解压后目录
(3)./configure --host=arm-none-linux-gnueabi --prefix=$PWD/install --without-ada --enable-termcap --with-shared
(4) make
(5)make install

5.1、ncures编译过程中遇到问题记录

  make install 问题 1

/usr/bin/install: strip process terminated abnormally
Makefile:201: recipe for target 'install.progs' failed
make[1]: *** [install.progs] Error 1
make[1]: Leaving directory '/root/Pwn/tmp/gdb-aarch64/tmux/tmux/ncurses-6.1/progs'
Makefile:113: recipe for target 'install' failed

  方法1问题原因

install.progs问题
问题在于gcc和strip不是同一个arch的。交叉编译时CC已经指定,但是strip依然是系统的strip。强行ln -s软连接指定交叉编译链中的strip
ln -s /mnt/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-strip strip

/usr/bin/strip
还原方法
Ubuntu原来strip文件
strip -> x86_64-linux-gnu-strip
ln -s x86_64-linux-gnu-strip strip

  方法2不使用strip规避此问题

在configure选项中 去掉strip
./configure --host=arm-linux-gnueabihf --prefix=$PWD/libb --disable-stripping --without-ada --enable-termcap --with-shared

  make install 问题 2

/bin/sh ./run_tic.sh
** Building terminfo database, please wait...
Running /usr/bin/tic to install /mnt/hgfs/zpj/GDB/ncurses-5.9/libb/share/terminfo ...

        You may see messages regarding extended capabilities, e.g., AX.
        These are extended terminal capabilities which are compiled
        using
                tic -x
        If you have ncurses 4.2 applications, you should read the INSTALL
        document, and install the terminfo without the -x option.

"terminfo.tmp", line 306, terminal 'lpr': can't link l/lpr to p/printer
? tic could not build /mnt/hgfs/zpj/GDB/ncurses-5.9/libb/share/terminfo
Makefile:86: recipe for target 'install.da`在这里插入代码片`ta' failed
make[1]: *** [install.data] Error 1
make[1]: 离开目录“/mnt/hgfs/zpj/GDB/ncurses-5.9/misc”
Makefile:109: recipe for target 'install' failed
make: *** [install] Error 2

  问题原因

1、 tic工具架构问题:通过find 本机全部tic 通过file查看其架构将x86架构路径添加到环境变量,优先寻找
PATH=/usr/bin:$PATH
2、主机上ncureses版本过低(tic命令由ncureses提供的)
通过编译安装高版本ncuress解决此问题

然后去需要交叉编译的环境中make install
成功之后只需将生成的 lib和include拷贝到设备的相关路径即可(/usr/lib 和/usr/include /usr/bin )

5.2、gdb交叉编译移植

  需要在解压后的源码目录中新建文件夹build用于放置交叉编译后生成的相关文件方便查找(可自行设置其他路径),在gdb-11.2路径下内配置configure生成Makefile

cd gdb-11.2
../configure --host=arm-linux-gnueabihf --prefix=$PWD/build
make
make install

  将新建目录下的 生成的build文件下的bin文件下gdb和gdbserver文件拷贝到设备中完成gdb移植

  ps:时间有限,后续继续补充,如有错误,欢迎指正

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

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

相关文章

Nginx:worker_processes、worker_connections设置

转自:Nginx:worker_processes、worker_connections设置_worker_connections设置多少_it_zhenxiaobai的博客-CSDN博客 worker_processes与worker_connections 设置好合适大小,可以提升 nginx 处理性能,非常重要。 原作者的话&…

【PSO-LSTM】基于PSO优化LSTM网络的电力负荷预测(Python代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

eSIM证书要求-涉及规范SGP.22-SGP.26-2

subjectPublicKeyInfo 证书链中所有证书的subjectPublicKeyInfo中的OID都是一样的 CRL Distribution Point 证书吊销列表分发点 (CRL Distribution Point ,简称 CDP) 是含在数字证书中的一个可以共各种应用软件自动下载的最新的 CRL 的位置信息。一个 CDP 通常出现…

egg.js + mysql + windows 踩坑全纪录

资料: egg.js文档(https://www.eggjs.org/zh-CN/intro/quickstart) 背景:前面的都很简单,按照官方文档配置即可,全部调通以后,开始接触数据库mysql 因为米有后台开发背景,所以需要从…

从IDC数据库安全报告,看OceanBase安全能力

欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/ 作为数据的承载工具,数据库自身安全能力对于数据安全至关重要。数据库软件诞生至今,经过了几十年的发展和演进,已经成为 IT 系统中不可或缺的关键技术。但是随着…

MySQL原理(三):索引

前言 上一篇介绍了 MySQL 的逻辑架构和执行过程,这一篇将介绍索引相关的内容。 索引是用额外的数据结构,来实现快速检索目标数据的。就像字典当中的目录一样,用额外的空间来存储部分内容,从而加快检索速度。 MySQL 的逻辑架构分…

Python——PyQt5在PyCharm的配置与应用(保姆级教程)

目录 一、安装pycharm与python版本 二、升级pip与换源,安装PyQt5、PyQt5-tool 三、添加环境变量 四、在pycharm的外部工具里添加3个工具 4.1、添加三个插件(重点) 五、如何使用QtDesigner 六、如何使用pyuic5 一、安装pycharm与python版…

C语言——扫雷小游戏(递归展开版)

哈喽,大家好,上次我们已经学习了三子棋小游戏,今天我们来学习扫雷小游戏了。 目录 1.游戏介绍 2.函数部分 2.1菜单 2.2game()函数 2.3mian()函数 2.4初始化棋盘 2.5打印棋盘 2.6布置雷 2.7排查雷 2.8统计雷 2.9递归,展开一片区域 …

眼球追踪、HDR、VST,从代码挖掘Valve下一代VR头显

擅长爆料、挖掘线索的Brad Lynch,此前发布了Quest Pro等设备的线索文章引发关注。​近期,又公布一系列与“Valve Deckard”VR头显相关消息,比如支持眼球追踪、HDR、VST透视、Wi-Fi网络等等。在SteamVR 1.26.1测试版更新、Steam用户端、Gamesc…

lazada、shopee转化率低怎么办?做好这几点,让你的店铺转化率提升

如若lazada, shopee如果转化率低,商家需要做好以下几个方面,通过以下几点来提高。毕竟只有流量没有转化率,店铺管理不好。 1、产品类别的选择 一个好的类别本身就是一个很好的排水渠道,可以给我们带来大量的流量,高流…

数据结构与算法基础(王卓)(38):排序、全部PPT、笔记整理

首先,庆祝本系列完结撒花! 对了,后续应该会把王卓老师所有的PPT附带笔记全部打包上传百度云 回头我把链接贴出来,感兴趣的朋友可以Mark一下,希望可以帮助到大家 如果有什么写的不对的地方,先给大家说声抱…

23年的软件测试前景?我卷自动化测试卷出头了,拿下22K*15薪...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 测试工程师主要干…

Linux一学就会——管道通信

管道通信 进程间通信目的 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件&…

通过计算系统稳定性比较迭代次数

有一类差值结构可能有一行中的数字比其他行的都多,因此有天然的底部,很容易确定平均列的顺序。但是可能有的差值结构相同的底部不止一个,这次比较双底部差值结构迭代次数的顺序。 ( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有3个节…

2023年US News最佳MBA排名出炉,申请需要哪些条件?

在出国留学的大环境下,MBA文凭一直都非常受欢迎,美国商学院是中国学生热衷的留学方向,而针对管理者的MBA项目也受到追捧。 US News 统计了美国130个全日制MBA的毕业生起薪,2023年毕业生的平均工资为 $105,684,Top 10 …

纽扣电池/含纽扣电池商品亚马逊美国澳洲站点合规认证要求!

纽扣电池/含纽扣电池商品亚马逊美澳站点合规认证 亚马逊美国站纽扣电池(含纽扣电池产品)合规要求标准: 16CFR1700.15部分(防毒包装标准) 16CFR1700.20部分(特殊包装的检测程序) ANSI C18.3M(便携式锂原电池的安全标准) 警示标签声明要求(…

对于零基础小白来说,转行学云计算和java哪个更好一些?求推荐

对于零基础小白来说,转行学云计算和java哪个更好一些? 云计算和Java是两个不同的技术领域,虽然它们都与计算机网络、分布式系统和互联网应用程序等相关,但它们的学习重点和应用场景也不同。虽然他们都是非常有前途的IT领域&#x…

Web3中文|比特币 BRC-20 让“闪电网络”再受热议

一位幸运的矿工在上周日晚上赚取了 6.701 枚BTC(约 200,000 美元)的交易费用,超过了当前的 6.25 BTC 的区块奖励。这一极为罕见的事件说明了与 Ordinals 协议相关的区块链活动导致了用户成本的飙升。 高昂的比特币交易费用 2022年底&#xff…

RT-DETR原理与简介(干翻YOLO的最新目标检测项目)

概述与简介 RT-DETR是一种实时目标检测模型,它结合了两种经典的目标检测方法:Transformer和DETR(Detection Transformer)。Transformer是一种用于序列建模的神经网络架构,最初是用于自然语言处理,但已经被证…

反射机制【Java】

文章目录 定义获得Class对象的方式反射的具体使用几个重要的类及方法反射的优缺点 在一些特定的场景中,我们可能会需要获取一些私有的成员变量或方法的信息,但直接在类外调用是无法成功获取到的,因此我们就需要一种机制来获取一些需要的变量或…