浅谈 Android Tombstone(墓碑日志)分析步骤

news2025/1/12 18:06:52

        最近项目产品刚刚出货,客户退机、死机事件频发。日常解决bug中,少不了和墓碑日志打交道,截止今天之前,见到墓碑日志都是一脸懵逼,不知道怎么分析。最近又有了两个日志,硬着头皮看吧。之所以称之为浅谈,也的确是实事求是了,因为一顿操作下来,即使找到了日志报错的位置,我好像还是解决不了问题,不得其道。Android 开发,任重而道远啊。

        首先,要学会站在巨人的肩膀上处理问题,先看看别人都怎么处理的,对处理步骤有个脸熟,再上手操作,所谓先知道,再做到,再熟练。

        参考:

https://www.cnblogs.com/codertian/p/5980426.htmlAndroid Tombstone(墓碑日志)解决步骤_墓碑日志怎么看_ZalGGboy的博客-CSDN博客

Add2line_addr2line file format not recognized_要努力的大倩的博客-CSDN博客

【我的Android进阶之旅】如何在Android Studio开发NDK的时候,通过addr2line或者ndk-stack来定位出错代码的位置_android studio ndk找不到addr2line_字节卷动的博客-CSDN博客

https://www.cnblogs.com/pyjetson/p/14924240.html

android 查看so 方法_关于android调用栈的使用以及使用addr2line定位crash具体位置_weixin_39947016的博客-CSDN博客

【汇编实战开发笔记】一段汇编代码如何“反编译”成C代码?-云社区-华为云


 

【汇编实战开发笔记】ARM汇编基础的三大块知识_arm 汇编 ands r1 ,r2_架构师李肯的博客-CSDN博客

       

        好了,看了就等于会了,开始干吧。

        看第一处:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'qti/trinket/trinket:11/RKQ1.211119.001/37:user/test-keys'
Revision: '0'
ABI: 'arm64'
Timestamp: 2023-06-15 00:54:53+0800
pid: 2451, tid: 2451, name: init  >>> /system/bin/init <<<
uid: 0
signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
Abort message: 'cannot setexeccon('u:r:qti-testscripts:s0') for qti-testscripts: Invalid argument'
    x0  0000000000000000  x1  0000000000000993  x2  0000000000000006  x3  0000007ff60ca470
    x4  0000000000000000  x5  0000000000000000  x6  0000000000000000  x7  000000000000000a
    x8  00000000000000f0  x9  33f5a0c3d7ce4b23  x10 0000000000000000  x11 ffffffc0ffffffdf
    x12 0000000000000001  x13 3a73747069726373  x14 0000007f98608d22  x15 0000ffff00000fff
    x16 0000007f98605c80  x17 0000007f985e7bb0  x18 0000007f98fd0000  x19 0000000000000993
    x20 0000000000000993  x21 00000000ffffffff  x22 0000007f98e90000  x23 0000007f98e90000
    x24 b400007e181631d0  x25 0000007ff60cad71  x26 0000000000000000  x27 0000007ff60caab0
    x28 0000007f9859f8ec  x29 0000007ff60ca4f0
    lr  0000007f9859b3e0  sp  0000007ff60ca450  pc  0000007f9859b40c  pst 0000000000000000

backtrace:
      #00 pc 000000000004e40c  /system/lib64/bootstrap/libc.so (abort+164) (BuildId: f4881cdb04823cc0d8c0fa3f95c4db2e)
      #01 pc 0000000000011db0  /system/lib64/libbase.so (android::base::DefaultAborter(char const*)+12) (BuildId: 01a12dd5224373edcc3a74506f64a9c9)
      #02 pc 0000000000013978  /system/lib64/libbase.so (android::base::SetAborter(std::__1::function<void (char const*)>&&)::$_3::__invoke(char const*)+76) (BuildId: 01a12dd5224373edcc3a74506f64a9c9)
      #03 pc 0000000000012fa4  /system/lib64/libbase.so (android::base::LogMessage::~LogMessage()+320) (BuildId: 01a12dd5224373edcc3a74506f64a9c9)
      #04 pc 0000000000064690  /system/bin/init (android::init::Service::SetProcessAttributesAndCaps()+712) (BuildId: e9ea95e23ad71213480eae7c32ad286f)
      #05 pc 0000000000067250  /system/bin/init (android::init::Service::Start()+7808) (BuildId: e9ea95e23ad71213480eae7c32ad286f)
      #06 pc 0000000000059fb4  /system/bin/init (android::init::do_start(android::init::BuiltinArguments const&)+316) (BuildId: e9ea95e23ad71213480eae7c32ad286f)
      #07 pc 000000000003f7fc  /system/bin/init (android::init::RunBuiltinFunction(std::__1::function<android::base::expected<void, android::base::ResultError> (android::init::BuiltinArguments const&)> const&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)+480) (BuildId: e9ea95e23ad71213480eae7c32ad286f)
      #08 pc 000000000003f9ac  /system/bin/init (android::init::Command::InvokeFunc(android::init::Subcontext*) const+284) (BuildId: e9ea95e23ad71213480eae7c32ad286f)
      #09 pc 00000000000403f8  /system/bin/init (android::init::Action::ExecuteCommand(android::init::Command const&) const+76) (BuildId: e9ea95e23ad71213480eae7c32ad286f)
      #10 pc 00000000000402f4  /system/bin/init (android::init::Action::ExecuteOneCommand(unsigned long) const+332) (BuildId: e9ea95e23ad71213480eae7c32ad286f)
      #11 pc 000000000006ed58  /system/bin/init (android::init::ActionManager::ExecuteOneCommand()+184) (BuildId: e9ea95e23ad71213480eae7c32ad286f)
      #12 pc 00000000000844d4  /system/bin/init (android::init::SecondStageMain(int, char**)+6916) (BuildId: e9ea95e23ad71213480eae7c32ad286f)
      #13 pc 000000000002e178  /system/bin/init (main+292) (BuildId: e9ea95e23ad71213480eae7c32ad286f)
      #14 pc 00000000000499e4  /system/lib64/bootstrap/libc.so (__libc_init+108) (BuildId: f4881cdb04823cc0d8c0fa3f95c4db2e)


        先看 #14,它这里是首次调用的地方。按照前人的丝滑小连招,执行命令(这里在Linux环境中使用哪个目录下的 addr2line,参数怎么带,偏移位置写几位,这都是坑,看了上面的文章后,最后终于运行下面命令成功):

./prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-addr2line -f -e ./out/target/product/qssi/symbols/system/lib64/bootstrap/libc.so 000499e4

返回结果:

 如上面结果所示,说明:

①问题发生在 __libc_init 方法中;

②具体地,问题发生在 bionic/libc/bionic/libc_init_dynamic.cpp 中的 __libc_init 方法中,更具体地,是第 151 行。

看看这个地方:

         这只是代码调用链中,位于链首的一个方法,不代表问题就是出在这里。按常理,这个时候我们需要使用上面的命令,将 #14 到 #00 整个调用链都完善出来,观察调用链中的层层调用,看看问题出在哪里,再确定一下这是不是一个值得关注的问题,以及这是一个什么问题,怎么解决这个问题。

        先不着急逐个找出来,先大略从 #14 到 #00 看一下,好像发现了一点儿端倪:调用链中最后一个 #00 调用处,应该是 abort 了一个信息, 即上面的信息:

Abort message: 'cannot setexeccon('u:r:qti-testscripts:s0') for qti-testscripts: Invalid argument'

        那这里先查看这个 log 信息是从哪里打印出来的,不也是解决问题的思路么(当然,并不一定所有的墓碑日志会有这个abort message)。

        说干就干,看一下#14到 #00,大概知道这里问题大概率是发生于系统刚刚启动时,所以查找这个目标日志,基本在init相关的代码中查找即可,如下:


        找到了,查看代码具体位置:
 

         看上图中标记出来的行数,和方法名称,刚刚好和 #04 对应上了。所以,这个问题,基本可以确定为发生于上图中位置。

        上面还只是粗略的判断,并没有还原出调用链中所有的方法调用过程。。

 

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

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

相关文章

fail-safe 机制与 fail-fast 机制分别有什么作用

fail-safe 和 fail-fast &#xff0c;是多线程并发操作集合时的一种失败处理机制。 Fail-fast &#xff1a; 表示快速失败&#xff0c;在集合遍历过程中&#xff0c;一旦发现容器中的数据被修改了&#xff0c;会立刻抛ConcurrentModificationException 异常&#xff0c;从而导致…

蓝奥声开发高性价比智能wifi插座进军智能家居

智能硬件的大潮袭来让智能家居这一并不新鲜的概念再次火热起来&#xff0c;关于智能家居的各种场景的描述给了我们很大的想象空间&#xff0c;然而落到实处真正开始走进生活时却又显得那么骨感&#xff0c;一时间作为智能家居的控制中介&#xff0c;小巧实用智能插座就成为家居…

多元分类预测 | Matlab粒子群算法(PSO)优化混合核极限学习机(HKELM)分类预测,多特征输入模型,PSO-HKELM分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab粒子群算法(PSO)优化混合核极限学习机(HKELM)分类预测,多特征输入模型,PSO-HKELM分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matl…

C++ 内联函数基本概念学习

https://blog.csdn.net/bcbobo21cn/article/details/71305186 这里是一些内联函数示例&#xff1b;有时间再逐个看&#xff1b; 学习一下内联函数的基本概念&#xff1b; 其基本概念有三点&#xff1b; 函数调用都有开销&#xff1b;如果函数体代码比较多&#xff0c;那么…

物业租赁管理系统

物业租赁管理系统是现代宏观经济下的必备产品。随着城市化的加速和移民进城的人口数量的增加&#xff0c;房屋租赁业务市场得到了前所未有的爆发式增长。在这个市场中&#xff0c;物业租赁管理系统成为了各大物业公司的重要工具&#xff0c;有助于物业公司更加有效地管理各种房…

Python_类对象、实例对象、类属性、实例属性、类方法、实例方法

目录 认识类对象、实例对象、类属性、实例属性、类方法、实例方法 类对象实例化过程中的内存分配说明 认识类对象、实例对象、类属性、实例属性、类方法、实例方法 类对象&#xff1a;定义的类就是类对象实例对象&#xff1a;类对象实例化后就是实例对象类属性&#xff1a;定…

HarmonyOS/OpenHarmony应用开发-Stage模型应用程序包结构

基于Stage模型开发的应用&#xff0c;经编译打包后&#xff0c;其应用程序包结构如下图应用程序包结构&#xff08;Stage模型&#xff09;所示。开发者需要熟悉应用程序包结构相关的基本概念。 在开发态&#xff0c;一个应用包含一个或者多个Module&#xff0c;可以在DevEco S…

web自动化测试思路及实战:PO设计模式介绍

Page Objects 设计模式 Page Objects概念&#xff1a; Page Objects是指UI界面上用于与用户进行交互的对象 pageobjects 设计模式概念&#xff1a; pageobjects 模式是Selenium中的一种测试设计模式&#xff0c;主要是将每一个页面设计为一个Class&#xff0c;其中包含页面…

vue3 拖拽实现,最简单的demo

入门教程&#xff0c;后续有时间会慢慢更新&#xff0c;下面是一个简单demo实现拖拽功能 <template><div><div ref"targetDom" id"div" dragenter"dragenter">我是可放置目标</div><p id"drag" draggable…

声明式事务

1.回顾事务 把一组业务当成一个业务来做&#xff1a;要么都成功&#xff0c;要么都失败&#xff01;事务在项目开发中&#xff0c;十分的重要&#xff0c;涉及到数据的一致性问题&#xff0c;不能马虎&#xff01;确保完整性和一致性&#xff1b; 事务ACID原则 原子性一致性…

基于PyQt5的桌面图像调试仿真平台开发(2)UI设计和控件绑定

系列文章目录 基于PyQt5的桌面图像调试仿真平台开发(1)环境搭建 基于PyQt5的桌面图像调试仿真平台开发(2)UI设计和控件绑定 基于PyQt5的桌面图像调试仿真平台开发(3)黑电平处理 基于PyQt5的桌面图像调试仿真平台开发(4)白平衡处理 基于PyQt5的桌面图像调试仿真平台开发(5)…

value-initialization of reference type ‘nlohmann::basic_json<>’的错误

使用json出现这个错误&#xff0c;是因为gcc的版本问题&#xff0c;我的是4.8版本 解决办法就是更改gcc版本&#xff0c;我更改的版本是9.3 参考更改版本(3条消息) 【Linux基础】CentOS 7环境下安装高版本GCC (gcc/g 9.3)_centos7gcc版本_宁海没有七号公园的博客-CSDN博客

leetcode验证回文字符串

链接: 验证回文字符串 class Solution { public:bool isLetterOrNumber(char ch){return (ch>a && ch<z)|| (ch> 0 && ch < 9);}bool isPalindrome(string s) {//大写字母转换成小写for(auto& ch : s){if(ch> A && ch < Z){ch…

POI导出Excle工具类(反射读取Java类)

文章目录 简介操作Excel相关组件使用工具类 简介 POI是Apache软件基金会用Java编写的免费开源的跨平台的 Java API&#xff0c;Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 所以POI的主要功能是可以用Java操作Microsoft Office的相关文件&#xff0…

【uniapp开发小程序】点击获取手机号(使用@getphonenumber)

一、实现效果 二、代码实现&#xff1a; <template><view><view class"shopadd" v-if"info.mobile">{{info.mobile}}</view><button class"getNumber" v-else open-type"getPhoneNumber" getphonenumber…

linux php 内置服务器测试 phpinfo

环境&#xff1a;linux 操作系统&#xff0c;有图形化界面&#xff0c;有浏览器 php -S localhost:8000直接使用 -S 命令选项&#xff0c;然后指定地址及端口号&#xff0c;我们就可以运行起来一个 PHP 内置的简易WEB服务器。默认情况下&#xff0c;这个地址会找当前目录下的 …

干货|三个维度详解 Taier 本地调试原理和实践

在平时和开发者们交流的过程中&#xff0c;发现许多开发朋友尤其是新入门 Taier 的开发者&#xff0c;对于本地调试都有着诸多的不理解和问题。本文就大家平时问的最多的三个问题&#xff0c;服务编译&#xff0c;配置&本地运行&#xff0c;如何在 Taier 运行 Flink-standa…

46 # 可读流 readStream

上一节实现了文件拷贝功能&#xff0c;其中的读和写的操作都耦合在一起了&#xff0c;能不能实现一个方法&#xff0c;可以用一行搞定&#xff0c;这里涉及到流里的 pipe 流 流是有方向的&#xff0c;先读出来再写&#xff0c;node 中实现了流的模块&#xff08;stream&#…

记一次使用MySQL数据库ORM为 SqlSugar 事务无效的处理过程

在项目中使用了开源代码框架admin.net &#xff0c;其使用的数据库ORM为SqlSugar 使用以下代码执行事务理论上应该有回滚发生&#xff0c;但数据任然删除了 [UnitOfWork][ApiDescriptionSettings(Name "Delete")] [HttpPost][DisplayName("删除菜单")]p…

linux上搭建nfs服务

NFS&#xff08;Network File System&#xff09;&#xff1a;它最大的功能就是可以通过网络&#xff0c;让不同的机器、不同的操作系统可以共享彼此的文件。 NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中&#xff0c;而在本地端的系统中来看&…