arm环境使用GDB调试

这篇具有很好参考价值的文章主要介绍了arm环境使用GDB调试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

        调试设备代码的时候,经常碰到程序异常或者功能对不上,以前这种时候就是加打印消息,然后重新编译把程序放进去跑,通过打印消息来判断代码出问题的点在哪里,但是有的时候可能需要反复加多次才能定位到问题点,而使用gdb调试就可以很快找到问题,非常效率,虽然GDB调试的文章已经很多了,但还是想写写来记录一下。

前期工作

        我使用的是主机端使用gdb,设备端使用gdbserver的方式去调试,所以需要在先编译一个arm版本的gdbserver

我所使用的编译器:arm-linux-gnueabihf-gcc

gdb源码版本:gdb-8.3

编译生成的程序我已经上传到我的gitee,如果不想编译的话可以直接下载我的用

arm环境GDB调试: arm环境下使用gdb调试 (gitee.com)

gdbserver编译

        只需要交叉编译gdbserver即可,因为一般你安装的arm编译器是带gdb的,可以查看你的交叉编译器选项,就会发现一般有arm-linux-gnueabihf-gdb这个程序,当然你也可以重新编译一个arm版本的gdb,这个不影响,我实测下来,都可以使用。

arm环境使用GDB调试,arm开发,linux,ubuntu

进入源码目录,再到gdb-8.3/gdb/gdbserve这个目录下,打开终端,输入命令裁剪

./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf  --prefix=/opt/gdb/gdbserver-lib
# --host:该软件将运行的平台,填你的交叉编译器
# --target:该软件所处理的目标平台,填你的交叉编译器
# --prefix:目标文件生成路径

裁剪完后直接编译安装

make 
make install

最后会在指定目录下生成程序

arm环境使用GDB调试,arm开发,linux,ubuntu

把这个程序放到arm开发板,如果觉得程序太大了的话,可以执行strip命令,减小程序大小

arm-linux-gnueabihf-strip arm-linux-gnueabihf-gdbserver

GDB调试

我们写一段程序测试一下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char buf[] = "hello world";
	char data[100];
	char *data2;
	
	for(int i = 0; i < strlen(buf); i++)
		data[i] = buf[i];
	
	printf("data:%s\n", data);
	
	strcpy(data2, data);
	
	printf("data2:%s\n", data2);
	
	return 0;
}

用arm编译器编译,注意编译的时候加上-g,支持gdb调试

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

接着放到arm开发板使用gdbserver运行

# 执行命令格式为./gdbserver :端口号 程序
./gdbserver :1234 gdbtest

arm环境使用GDB调试,arm开发,linux,ubuntu

然后在主机先执行命令

arm-linux-gnueabihf-gdb -tui
# -tui 在GDB调试中显示源代码

 进入gdb后,输入指令连接开发板

# 格式 target remote 开发板ip:端口号(端口号需一致)
target remote 10.10.10.174:1234

arm环境使用GDB调试,arm开发,linux,ubuntu

这时候就可以查看源码打断点进行调试了

arm环境使用GDB调试,arm开发,linux,ubuntu

输入c直接运行,可以看到程序此时发生了段错误,所以如果实际中编程程序挂掉的话,可以先打断点,然后在单步执行,很快就能定位到段错误的位置。

GDB调试core文件

一般情况下,在开发阶段正常,但是在测试的时候程序就可能挂掉,但是不可能一直开着gdbserver去跑,而且问题不一定好复现,这个时候就要靠core文件去定位问题点了,在运行程序前设置core文件

ulimit -c unlimited
# 设置进程生成core文件的大小限制。将其设置为 "unlimited" 表示不限制core文件的大小,即进程崩溃时可以生成任意大小的core文件
echo '/tmp/core.%e.%p.%t' | tee /proc/sys/kernel/core_pattern
# 生成的core文件会保存在 /tmp 目录下,并以 "core.可执行文件名.进程ID.时间戳" 的格式命名。

然后直接执行执行程序

arm环境使用GDB调试,arm开发,linux,ubuntu

可以看到,在我指定的目录下,生成了core文件,把这个core文件拷贝到主机,然后执行命令

arm-linux-gnueabihf-gdb gdbtest core.gdbtest.6934.1705905673

然后使用bt命令就可看到段错误的位置了

arm环境使用GDB调试,arm开发,linux,ubuntu

这样就可以迅速定位到问题点了。

总结

        GDB调试是一个很强大的工具,这里只是简单的讲了一下gdb的用法,还有很多功能,本人也还在继续学习使用。

        希望我的文章可以帮助到你!!!文章来源地址https://www.toymoban.com/news/detail-824044.html

到了这里,关于arm环境使用GDB调试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux之基础开发工具gdb调试器的使用(三)

    📘北尘_ :个人主页 🌎个人专栏 :《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 yum install -y gdb 程序的发布方式有两种,debug模式和release模式 Linux gcc/g++出来的二进制程序,默认是release模式,release模式下无法调试 要使用gd

    2024年02月05日
    浏览(50)
  • 【问题记录】Ubuntu 22.04 环境下,程序报:段错误(核心已转储)怎么使用 core 文件和GDB调试器 解决?

    目录 环境 问题情况 解决思路 原因分析 解决方法 番外知识 VMware® Workstation 16 Pro (版本:16.1.2 build-17966106) ubuntu-22.04.2-desktop-amd64 本人在运行百万并发的服务端程序时,程序运行报: 段错误(核心已转储) ,导致程序异常退出,如下 首先要确定核心转储文件的生成路径和

    2024年02月06日
    浏览(49)
  • Linux环境下gdb调试方法与演示

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Linux专栏】🎈 本专栏旨在分享学习Linux的一点学习心得,欢迎大家在评论区讨论💌 演示环境: centos7 如果还未安装gdb的话,输入下面命令进行安装即可: 首先,gd

    2024年02月07日
    浏览(34)
  • ubuntu22上使用qemu-system-arm调试linux

    qemu是用软件模拟硬件解析指令运行的软件,可以模拟arm、arm64、x86等,对于调试linux 内核机制很方便,不用额外购买开发板。由于linux上有对qemu的加速引擎,支持程度更高,且网络上教程居多,所以这里使用virtualbox+ubuntu22虚拟机,在ubuntu上运行qemu进行模拟。 virtualbox安装:

    2024年01月25日
    浏览(52)
  • Linux开发工具之调试器gdb

    程序的发布方式有两种,debug模式和release模式 Linux gcc/g++出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项   所以一份代码若要被调试必须是debug模式,但是在linux下我们编译代码的时候默认为release模式,要想让我们的代码

    2024年02月07日
    浏览(46)
  • [linux开发工具]小程序--进度条、调试器 - gdb

    📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 第一种情况 执行结果如下: 可以看到程序先执行printf再执行sleep 第二种情况 执行结果如下: 在这里

    2024年02月22日
    浏览(44)
  • 【Linux】Linux调试器-gdb使用

    程序的发布方式有两种,debug模式和release模式 Linux gcc/g++出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项 退出:  调试命令: list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。 list/l 函数名:列出某

    2024年02月21日
    浏览(50)
  • 【Linux】gdb调试器的使用

    文章目录 一、gdb简介 二、调试前的准备 1、生成调试文件 2、启动 gdb  三、gdb 使用方法  1、查看源代码 2、设置 / 查看断点(多种方式设置断点) 方法一 方法二 方法三 3、run  4、删除断点、断点无效 5、逐过程调试(以函数为单位) 6、逐语句调试 7、查看调用链 8、查看变

    2024年02月02日
    浏览(53)
  • 【Linux】——调试器-gdb的使用

    序言: 本期,我将带领大家学习的关于linux下的 调试器gdb 的使用,废话不多说跟着我一起去看看吧!! 目录 前言 (一)背景介绍 1、debug模式和release模式 2、为什么Release不能调试但DeBug可以调试 3、初步见识 1️⃣readelf (二)调试代码 1、命名大全 2、具体演示 0️⃣行号显

    2024年02月07日
    浏览(41)
  • Linux 使用gdb调试C程序

    一、gdb的一些基础命令 l :显示代码 l n :跳转到当前代码页的第n行的代码 l filename.c :n :跳转到filename.c文件的第n行代码 b 行号 :加断点 info break :查看断点信息 delete 断点编号 :删除断点 r ,运行程序 n ,单步执行 c ,继续执行,遇到断点停止执行 p ,打印 s ,进入函数

    2024年02月13日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包