安卓框架,谈谈出现tombstone时addrline的使用

backtrace:
#00 pc 0003a428 /system/lib/libc.so (tgkill+12)
#01 pc 000181e3 /system/lib/libc.so (pthread_kill+66)
#02 pc 00018deb /system/lib/libc.so (raise+10)
#03 pc 0001563f /system/lib/libc.so (__libc_android_abort+34)
#04 pc 00013c30 /system/lib/libc.so (abort+4)
#05 pc 002310fd /system/lib/libart.so (art::Runtime::Abort()+184)
#06 pc 0009f123 /system/lib/libart.so (art::LogMessage::~LogMessage()+2046)
#07 pc 00108a29 /system/lib/libart.so (art_heap_corruption(char const*)+140)
#08 pc 0010bb8d /system/lib/libart.so (mspace_bulk_free+772)
#09 pc 00145751 /system/lib/libart.so (art::gc::space::DlMallocSpace::FreeList(art::Thread*, unsigned int, art::mirror::Object**)+76)
#10 pc 00121a21 /system/lib/libart.so (art::gc::collector::MarkSweep::SweepArray(art::gc::accounting::AtomicStackart::mirror::Object*, bool)+816)
#11 pc 0012148b /system/lib/libart.so (art::gc::collector::MarkSweep::ReclaimPhase()+230)
#12 pc 001262e9 /system/lib/libart.so (art::gc::collector::MarkSweep::RunPhases()+164)
#13 pc 0011b591 /system/lib/libart.so (art::gc::collector::GarbageCollector::Run(art::gc::GcCause, bool)+220)
#14 pc 0013de5b /system/lib/libart.so (art::gc::Heap::CollectGarbageInternal(art::gc::collector::GcType, art::gc::GcCause, bool)+2214)
#15 pc 0013efe7 /system/lib/libart.so (art::gc::Heap::ConcurrentGC(art::Thread
)+46)
#16 pc 0000015f /data/dalvik-cache/arm/system@framework@boot.oat

参考:https://blog.csdn.net/u012248972/article/details/72540901?locationNum=9&fps=1
https://blog.csdn.net/jxgz_leo/article/details/53458366

使用addrline2解析backtrace
1.找到发生问题的so库,如libc.so,把它放在android-5.1.1\prebuilts\gcc\linux-x86\aarch64\aarch64-linux-android-4.8\bin中
2.在linux服务器上输入命令
addr2line -C -e libc.so -f 0003a428
0003a428来自于#00 pc 0003a428 /system/lib/libc.so (tgkill+12)

一般情况下这样使用是没问题的,但是很多时候问题都发生在so库即动态库中就不能很好的打印出具体报错的地方,再加上出现tombstone时往往终端会重启,导致tomgstone记录的地址不能和重启后的地址对应。

举个例子,要测试复现该bug时要先保存下环境
1.在终端的/system/lib 中找到发生问题的so库,如libc.so,保存在linux服务器上的android-5.1.1\prebuilts\gcc\linux-x86\aarch64\aarch64-linux-android-4.8\bin
2.终端上使用ps 找出so库的进程id,一般就是app的进程,如2467,然后cd/proc/2467
cat maps |grep libc.so
显示如下内容 把第一行的地址保存下来
f7439000-f749f000 r-xp 00000000 b3:0d 41034 /system/lib/libc.so
f74a0000-f74a3000 r–p 00066000 b3:0d 41034 /system/lib/libc.so
f74a3000-f74a6000 rw-p 00069000 b3:0d 41034 /system/lib/libc.so

发生tombston后取出日志,确认下tombstone的地址是否在f7439000-f749f000之间,如果是则用tombstopn与f7439000差的绝对值value
输入命令addr2line -C -e libc.so -f value

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值