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

article/2025/10/6 21:26:27

        最近项目产品刚刚出货,客户退机、死机事件频发。日常解决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  0000007ff60ca470x4  0000000000000000  x5  0000000000000000  x6  0000000000000000  x7  000000000000000ax8  00000000000000f0  x9  33f5a0c3d7ce4b23  x10 0000000000000000  x11 ffffffc0ffffffdfx12 0000000000000001  x13 3a73747069726373  x14 0000007f98608d22  x15 0000ffff00000fffx16 0000007f98605c80  x17 0000007f985e7bb0  x18 0000007f98fd0000  x19 0000000000000993x20 0000000000000993  x21 00000000ffffffff  x22 0000007f98e90000  x23 0000007f98e90000x24 b400007e181631d0  x25 0000007ff60cad71  x26 0000000000000000  x27 0000007ff60caab0x28 0000007f9859f8ec  x29 0000007ff60ca4f0lr  0000007f9859b3e0  sp  0000007ff60ca450  pc  0000007f9859b40c  pst 0000000000000000backtrace:#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://chatgpt.dhexx.cn/article/1QHVugEK.shtml

相关文章

Android tombstone文件是如何生成的

本节内容我们聚焦到androidQ上&#xff0c;分析android中一个用于debug的功能&#xff0c;那就是tombstone&#xff0c;俗称“墓碑”。现实生活中墓碑一般是给死人准备的&#xff0c;而在android系统中“墓碑”则是给进程准备的。 为何Android要设计出这样一个东西呢&#xff…

【Android NDK 开发】NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 获取 tombstone_0X 崩溃日志信息 )

文章目录 一、崩溃信息描述二、手机命令行操作三、电脑命令行操作四、Tombstone 内容 Tombstone 报错信息日志文件被保存在了 /data/tombstones/ 目录下 , 先 ROOT 再说 , 没有 ROOT 权限无法访问该目录中的信息 ; 使用 Pixel 2 手机进行调试 , 其它 ROOT 后的手机也可以使用 …

Android tombstone 分析案例

Android tombstone 分析案例 tombstone文件内容1. 体系结构2. 发生Crash线程3. 原因4. 寄存器状态4.1 处理器工作模式下的寄存器4.2 未分组寄存器r0 – r74.3 分组寄存器r8 – r144.4 程序计数器pc(r15)4.5 程序状态寄存器4.6 ARM参数规则 5. 回溯栈6. 程序栈7. 寄存器地址附近…

RocksDB Tombstone 详解

目录 为什么会有墓碑&#xff1f; 使用场景 原理 描述 分段 查询 优化点 总结 为什么会有墓碑&#xff1f; 我们知道 TP 数据库一般选择 KV 引擎作为存储引擎&#xff0c;数据库的元数据和数据通过一定的编码规则变成 KV 对存储在存储引擎中&#xff0c;比如 CockroachD…

Tombstone 文件分析

Tombstone 文件分析 /* * 下面信息是dropbox负责添加的 **/ isPrevious: true Build: Rock/odin/odin:7.1.1/NMF26F/1500868195:user/dev-keys Hardware: msm8953 Revision: 0 Bootloader: unknown Radio: unknown Kernel: Linux version 3.18.31-perf-g34cb3d1 (smartcmhardc…

android Tombstone 流程

一 总述 下面是一份dump 的log&#xff1a; 810 876 I system_server: libdebuggerd_client: started dumping process 678 740 740 I /system/bin/tombstoned: registered intercept for pid 678 and type kDebuggerdNativeBacktrace 678 678 I libc : Requested du…

android tombstone log分析

今天和大家一起聊聊android 中出现的 Tombstone问题&#xff0c;近期在定制pad 上分析设备概率性重启&#xff0c;导出bugreport日志后&#xff0c;除了看到anr log外&#xff0c;同级目录下还看到了tombstones 并且对比以往日志&#xff0c;发现都生产了大量tombstone...,于是…

深入学习tombstone和signal

三驾马车&#xff08;CPU&#xff0c;内存和存储设备&#xff09;中&#xff0c;跑得最慢的就是存储设备了 电脑上&#xff0c;从HDD 到SSD&#xff0c;从SATA SSD到PCIe SSD&#xff0c;硬盘是越来越快&#xff1b; 手机上&#xff0c;从SD卡&#xff0c;到eMMC卡&#xff0…

tombstone

1.什么是tombstone 当一个动态库&#xff08;native 程序&#xff09;开始执行时&#xff0c;系统会注册一些连接到 debuggerd 的 signal handlers&#xff0c;当系统 crash 的时候&#xff0c;会保存一个 tombstone 文件到/data/tombstones目录下&#xff08;Logcat中也会有相…

Tombstone原理分析

本文主要围绕三个问题对tombstone进行分析和介绍&#xff0c;debuggerd是如何监控进程并生成tombstone的&#xff1f;tombstone文件中的信息都是什么&#xff0c;是怎么获取的&#xff1f;tombstone文件应该怎么分析&#xff1f; 一、Tombstone简介 当一个native程序开始执行时…

【date】Linux date命令修改时间的问题

Linux date命令修改时间的问题 问题路径找原因解决方法 问题 Android10&#xff1b;高通平台 使用下面date命令修改时间日期&#xff0c;时分秒生效&#xff0c;年月日不生效 > date -D YYYY-MM-DD hh:mm:ss 路径 \android\external\toybox\toys\posix\date.c \android\e…

i2ctools工具移植到android(使用NDK方式 在某android平台测试)

前提条件 主板i2c已在设备树配置status和引脚复用正常&#xff0c;即设备的i2c总线达到正常使用条件I2C device interface假设内核已配置进去 编译工具链NDK环境搭建 下载NDK 下载地址点我解压 ~/workspace/ndk$ ls android-ndk-r22b android-ndk-r22b-linux-x86_64.zip …

高通平台 Android9 adb shell “hwclock -w“ 报错

hwclock -w 报错 文章目录 hwclock -w 报错问题现象分析1. hwclock命令分析2. /dev/rtc0驱动节点分析 修改设备树后hwclock -w报错没有了&#xff0c;但是系统会重启&#xff0c;原因未知 问题现象 sdm660_64:/ # hwclock -w hwclock: ioctl 4024700a: Invalid argument分析 …

Android top命令、ps命令、busybox命令

top命令 usage: top [-Hbq] [-k FIELD,] [-o FIELD,] [-s SORT] [-n NUMBER] [-m LINES] [-d SECONDS] [-p PID,] [-u USER,]Show process activity in real time.-H Show threads -k Fallback sort FIELDS (default -S,-%CPU,-ETIME,-PID) -o Show FIELDS (def PID,USER,PR,N…

OpenHarmony啃论文俱乐部—盘点开源鸿蒙引用的三方开源软件[1]

目录这里写自定义目录标题 OpenHarmony third_party三方库&#xff1a;学术研究和参与开源的结合third_party_openh264third_party_ninjathird_party_gnthird_party_markupsafethird_party_toyboxthird_party_gstreamerthird_party_ffmpegthird_party_mtdevthird_party_flutter…

Android缺少awk工具的几种解决方法

在日常测试中&#xff0c;我们会用到各种各样的Android平台&#xff0c;用于测试存储设备的性能。其中&#xff0c;我们依赖到Android平台自身的工具&#xff0c;通过编写shell脚本来实现测试存储设备的性能。   而awk工具(shell命令)在shell脚本中会经常用到&#xff0c;一般…

toybox 和 busybox 的作用

来自知乎&#xff1a;程序员秘书 ##前言## 我们在做android开发时&#xff0c;经常会有在板子系统里要修改文件内容对比验证问题&#xff0c;或者要操作特殊的shell命令操作看些信息&#xff0c;等等一些需求。但是往往会因为刷到板子的系统里默认没有/不支持相关的命令&…

欢乐听:一个简洁的瀑布流模式的音乐分享站

欢乐听 一个简洁的瀑布流模式的音乐分享站。

分享5个高质无损音乐网站,歌曲很丰富,爱听歌的小伙伴有耳福了

生活中很多人都离不开音乐&#xff0c;散步的时候听音乐&#xff0c;等待的时候听着音乐&#xff0c;心情不好的时候听音乐&#xff0c;不管走到哪&#xff0c;有音乐的陪伴一点也不寂寞&#xff0c;不同音乐的旋律给我们带来不同的心情&#xff0c;今天小编就给爱听音乐的小伙…

【音乐】收藏的300多首抖音神曲,MP3音乐分享,近一年的抖音歌曲

今天给大家分享N多&#xff08;300&#xff09;首抖音神曲。抖音大家都知道&#xff0c;各种火&#xff0c;各种原因&#xff0c;其中的BGM(背景音乐)更是起到了至关重要&#xff08;画龙点睛&#xff09;的作用&#xff0c;不知道是哪个大神搞的&#xff0c;去年我搞视频的时候…