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

        最近项目产品刚刚出货,客户退机、死机事件频发。日常解决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 对应上了。所以,这个问题,基本可以确定为发生于上图中位置。

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值