百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

使用addr2line工具定位系统崩溃

bigegpt 2024-09-03 11:01 3 浏览

引言

不管在PC端还是在嵌入式设备中,代码执行过程中运行出错,如栈溢出,引用野指针,重复free同一块内存等等,都是件非常可怕的事情。好在PC端操作系统会帮我们终止相关进程,并回收其资源,不至于导致整个操作系统崩溃。 而嵌入式设备就比较惨了,往往会导致系统宕机,直接重启,很大程度影响了我们产品的可靠性。 同时随着工程代码越来越庞大, 出现宕机的原因也难以具体分析出到底是哪一行导致的系统崩溃。今天我们就来介绍一个神器,即如何使用addr2line命令来跟踪代码运行出错时,具体是哪行代码导致的,以帮助我们定位问题所在。

addr2line是什么东东

addr2line 工具(它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址和可执行映像转换成文件名、函数名和源代码行数的工具。通俗来讲就是可以根据宕机时PC(程序计数器)的值来转化为具体执行了哪个文件下的函数中的代码(行号)。这里说的是esp8266和esp32采用xtensa交叉编译工具链,集成了Binutils中的工具集,如addr2line, ar,as,ld等等。它们分别在xtensa-lx106-elf\bin(esp8266),xtensa-esp32-elf\bin(esp32)目录中。

在linux中使用addr2line工具

既然知道了addr2line是GNU Binutils中的一个工具,那么我们就先在linux中尝尝鲜,看看addr2line是如何使用的吧。 这里我们简单编写一个简单的例子:定义一个int *指针,并初始化为NULL, 然后解引用,即赋值为0,具体如下:

//测试源文件test.c
#include <stdio.h>
 
int main(void)
{
	int *p = NULL;
	
	*p = 0;
	
	return 0;
} 

然后我们尝试编译,这里需要注意的是,要加-g选项,意思是在生成可执行文件中添加调试信息,否则之后是无法使用addr2line来定位问题的,这是因为addr2line的是依赖于调式信息来跟踪的。具体编译指令:

gcc -g test.c -o test

可以看到编译无错误无警告,接着我们尝试运行下:

运行出现段错误,相信原因大家都应该很清楚吧, 解引用一个为NULL的指针。

好了,接下来就是我们的主角addr2line大显神威的时候拉~

首先我们知道addr2line是基于PC(程序计算器)来定位的,因此我们就得知道出现段错误时,那时PC的值是多少,这里我们使用命令:

dmesg | grep test

简单介绍下上面命令的含义:

  • dmesg命令是linux中显示系统日志,即会记录系统从开机到运行的一些重要信息,其中就会包含上面我们运行出错的记录信息。
  • 符号 ‘|’ , 是管道的意思,所谓管道就是将前面(|的左边,如dmesg)的执行结果作为后面(|后面,如grep test)的输入
  • grep,是linux中非常强大的命令,可以查询文件中内容

综合以上含义,这条命令就是在系统日志中查询含有test(我们生成的可执行文件名)的内容,避免是在大量日志中繁琐的查找,直接定位。当然不嫌麻烦的小伙伴的,可以直接使用dmesg命令,然后自己手动去找,也是可以的哦~

注:上面显示的结果中有多出test记录,这是因为我之前测试不同的代码导致的,最后一个才是我最后执行出错的记录, 我们可以看到此时ip为‘00000000004004e6’

最后使用addr2line工具定位问题代码行,具体指令:

addr2line -e test 00000000004004e6

其中-e选项是用来指定要定位问题的可执行文件, 最后面00000000004004e6就是PC(ip)的值

从结果我们看到,addr2line工具帮我们定位到问题:在test.c的第8行代码,即*p = 0; 跟我们预想的一致,由于我们测试源文件比较简单,大家在测试的时候可以将测试代码写的复杂点哦~

esp8266/esp32 使用addr2line工具

esp8266和esp32作为目前物联网最热门的一块wifi芯片之一, 相信大家在开发过程中会遇到各种各样的问题。 而最让人头疼,摸不着头脑的就是系统崩溃重启,尤其没有经验的小伙伴根本不知道如何查找问题的根源,刚好原厂乐鑫提供的编译工具链中就有addr2line工具,给我们带来了极大便利。

这里以esp32为例子,以下是在实际工程中,在应用主函数app_main中简单实现了解引用NULL指针p,即赋值为0:

接着编译运行,串口输出:

可以看到系统崩溃了,打印了出一些信息: 如

Guru Meditation Error: Core 0 panic'ed (StoreProhibited). Exception was unhandled

其中StoreProhibited 粗略的告知我们是关于存储错误导致的,并打印了系统崩溃时,一些寄存器的值,而我们最关心的就是当前PC(程序计数器)的值, 上图中PC的值显示: 0x400e4235, 以及下方

Backtrace: 0x400e4235:0x3ffb4cf0 (这里需要说明的是esp8266和esp32是双核cpu,因此有2个PC程序计数器), 这里我们根据提示是核心core0崩溃的,对应的PC就是0x400e4235。OK,接下来我们就利用addr2line来定位出问题的代码:

首先我们cd到编译生成的buile文件夹中:

然后输入命令:

xtensa-esp32-elf-addr2line -e project-DD7002B.elf 0x400e4235

Enter回车:

可以看到输出显示出问题的代码所在的详细路径 和 行号,即在Test_Hub.c的第55行代码导致的系统崩溃,之后大家就可以以此为突破口来分析问题了。

总结

addr2line工具虽然能够帮助我们定位问题代码的路径和行号,但是不是所有的环境都支持该功能,因此大家在实际开发过程应当有自我意识,自己所写的每一行代码做到心中有数,尤其是在内存,指针等操作。 这就离不开平时的不断学习,提高自己的编程能力。


相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...