最近项目产品刚刚出货,客户退机、死机事件频发。日常解决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 对应上了。所以,这个问题,基本可以确定为发生于上图中位置。文章来源:https://www.toymoban.com/news/detail-742967.html
上面还只是粗略的判断,并没有还原出调用链中所有的方法调用过程。。文章来源地址https://www.toymoban.com/news/detail-742967.html
到了这里,关于浅谈 Android Tombstone(墓碑日志)分析步骤的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!