linux编译的so android闪退,android so库导致的闪退及tombstone分析

android中有3种crash情况:未捕获的异常、ANR和闪退。未捕获的异常一般用crash文件就可以记录异常信息,而ANR无响应表现就是界面卡着无法响应用户操作,而闪退则是整个app瞬间退出,个人感觉对用户造成的体验最差。闪退一般是由于调用so库出错导致,像类似非法地址访问等。

闪退发生时在logcat中将日志过滤条件选为“No Filters”就可以看到完整的闪退日志,或者叫tombstone(墓碑)文件。

tombstone(墓碑)是当系统 crash 的时候,会保存一个 tombstone 文件到/data/tombstones目录下(Logcat中也会有相应的信息),文件就像墓碑一样记录了死亡了的进程的基本信息(例如进程的进程 号,线程号),死亡的地址(在哪个地址上发生了 Crash),死亡时的现场是什么样的(记录了一系列的堆栈调用信息)等等。

闪退(tombstone)主要日志如下,中间太长部分用省略号省略。

--------- beginning of crash

2020-01-19 15:22:07.194 14414-14414/com.android.dj.crash.test A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xfffffffd in tid 14414 (dj.crashtest), pid 14414 (dj.crashtest)

2020-01-19 15:22:07.249 14414-18253/com.android.dj.crash.test V/IOTCAPIS: [io_recv_proc][297]:

2020-01-19 15:22:07.249 14414-18253/com.android.dj.crash.test V/IOTCAPIS: get remote packet ICE_SES_MSG_HIT

2020-01-19 15:22:07.303 18260-18260/? I/crash_dump32: obtaining output fd from tombstoned, type: kDebuggerdTombstone

2020-01-19 15:22:07.309 883-883/? I//system/bin/tombstoned: received crash request for pid 14414

2020-01-19 15:22:07.311 18260-18260/? I/crash_dump32: performing dump of process 14414 (target tid = 14414)

2020-01-19 15:22:07.313 1313-1416/system_process W/ActivityTaskManager: Activity pause timeout for ActivityRecord{567b991 u0 com.android.dj.crash.test/com.android.dj.crash.view.CrashTestActivity t2302 f}

···

2020-01-19 15:22:07.330 18260-18260/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

2020-01-19 15:22:07.330 18260-18260/? A/DEBUG: Build fingerprint: 'HUAWEI/VOG-AL00/HWVOG:10/HUAWEIVOG-AL00/10.0.0.185C00:user/release-keys'

2020-01-19 15:22:07.330 18260-18260/? A/DEBUG: Revision: '0'

2020-01-19 15:22:07.330 18260-18260/? A/DEBUG: ABI: 'arm'

2020-01-19 15:22:07.331 18260-18260/? A/DEBUG: SYSVMTYPE: Maple

APPVMTYPE: Art

2020-01-19 15:22:07.331 18260-18260/? A/DEBUG: Timestamp: 2020-01-19 15:22:07+0800

2020-01-19 15:22:07.331 18260-18260/? A/DEBUG: pid: 14414, tid: 14414, name: dj.crashtest >>> com.android.dj.crash.test <<<

2020-01-19 15:22:07.331 18260-18260/? A/DEBUG: uid: 10218

2020-01-19 15:22:07.331 18260-18260/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xfffffffd

2020-01-19 15:22:07.331 18260-18260/? A/DEBUG: r0 fffffffd r1 ff99f161 r2 80000000 r3 00660e9d

2020-01-19 15:22:07.331 18260-18260/? A/DEBUG: r4 ffffffff r5 b9f33000 r6 867cb252 r7 ff99f108

2020-01-19 15:22:07.331 18260-18260/? A/DEBUG: r8 00000000 r9 eb283e00 r10 ff99f7a0 r11 eb283e00

2020-01-19 15:22:07.331 18260-18260/? A/DEBUG: ip 20000000 sp ff99f0c8 lr 00000002 pc e9097000

2020-01-19 15:22:07.419 2378-10947/? D/HwRecentsTaskUtils: refreshToCache

2020-01-19 15:22:07.419 2378-10947/? D/HwRecentsTaskUtils: searchFromDate

2020-01-19 15:22:07.427 2302-10215/? E/HsmCoreServiceImpl: onTransact in code is: 103

2020-01-19 15:22:07.427 2302-10215/? I/MediaProcessHandler: playingUids:

···

2020-01-19 15:22:07.581 14414-18186/com.android.dj.crash.test I/IPCSDK: 1

2020-01-19 15:22:07.582 14414-18186/com.android.dj.crash.test V/IOTCAPIS: [p2p_global_thread][94]:

2020-01-19 15:22:07.582 14414-18186/com.android.dj.crash.test V/IOTCAPIS: p2p_global_thread GLOBAL_EVENT_MSG_CB_EVENT_SESSION_CONNECT_SUCCESS_P2P end

2020-01-19 15:22:07.691 18260-18260/? A/DEBUG: backtrace:

2020-01-19 15:22:07.691 18260-18260/? A/DEBUG: #00 pc 0004f000 /apex/com.android.runtime/lib/bionic/libc.so (__memcpy_a15+200) (BuildId: f2470da1a22265f8104ce6bb9bcaf63e)

2020-01-19 15:22:07.691 18260-18260/? A/DEBUG: #01 pc 00023d6f /data/app/com.android.dj.crash.test-dA-LA_OmHFay2acWJnDeJA==/lib/arm/libipcsdk.so (LoopBuffWrite+138) (BuildId: cf6a63bc513797ba7582c510f377f11c44a12970)

2020-01-19 15:22:07.691 18260-18260/? A/DEBUG: #02 pc 00031f75 /data/app/com.android.dj.crash.test-dA-LA_OmHFay2acWJnDeJA==/lib/arm/libipcsdk.so (CP2PSessionData::p2p_session_data_write(char*, int, unsigned char)+264) (BuildId: cf6a63bc513797ba7582c510f377f11c44a12970)

2020-01-19 15:22:07.691 18260-18260/? A/DEBUG: #03 pc 0002a561 /data/app/com.android.dj.crash.test-dA-LA_OmHFay2acWJnDeJA==/lib/arm/libipcsdk.so (IOTC_Session_WriteData+66) (BuildId: cf6a63bc513797ba7582c510f377f11c44a12970)

···

2020-01-19 15:22:07.693 18260-18260/? A/DEBUG: #134 pc 0000202f /system/bin/app_process32 (_start_main+38) (BuildId: 9979c215af59ed821fac6ea4f956225d)

2020-01-19 15:22:07.693 18260-18260/? A/DEBUG: #135 pc 00004456

可以看到

tombstone文件如何分析

主要看backtrace下面的函数调用,backtrace下的函数调用是从下往上的顺序执行的,所以在最上面的函数是最后执行的。

最后几行的函数调用如下:

2020-01-19 15:22:07.691 18260-18260/? A/DEBUG: backtrace:

2020-01-19 15:22:07.691 18260-18260/? A/DEBUG: #00 pc 0004f000 /apex/com.android.runtime/lib/bionic/libc.so (__memcpy_a15+200) (BuildId: f2470da1a22265f8104ce6bb9bcaf63e)

2020-01-19 15:22:07.691 18260-18260/? A/DEBUG: #01 pc 00023d6f /data/app/com.android.dj.crash.test-dA-LA_OmHFay2acWJnDeJA==/lib/arm/libipcsdk.so (LoopBuffWrite+138) (BuildId: cf6a63bc513797ba7582c510f377f11c44a12970)

2020-01-19 15:22:07.691 18260-18260/? A/DEBUG: #02 pc 00031f75 /data/app/com.android.dj.crash.test-dA-LA_OmHFay2acWJnDeJA==/lib/arm/libipcsdk.so (CP2PSessionData::p2p_session_data_write(char*, int, unsigned char)+264) (BuildId: cf6a63bc513797ba7582c510f377f11c44a12970)

2020-01-19 15:22:07.691 18260-18260/? A/DEBUG: #03 pc 0002a561 /data/app/com.android.dj.crash.test-dA-LA_OmHFay2acWJnDeJA==/lib/arm/libipcsdk.so (IOTC_Session_WriteData+66) (BuildId: cf6a63bc513797ba7582c510f377f11c44a12970)

我们需要记住最后几个函数调用的地址00023d6f、00031f75、0002a561,后面用到的工具分析以及反汇编后的文件分析都会用到这几个偏移地址。

分析工具

android的ndk中提供了多个工具可以进行so库导致的crash的分析。

1)addr2line

addr2line 是 用来获得指定动态链接库文件或者可执行文件中指定地址对应的源代码信息的工具

D:\DJ_Software\Android\Ndk_Download\android-ndk-r10e-windows-x86_64\android-ndk-r10e\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin>arm-linux-androideabi-addr2line -f -e D:\flash_anr_pc\libipcsdk.so 00023d6f

LoopBuffWrite

??:?

D:\DJ_Software\Android\Ndk_Download\android-ndk-r10e-windows-x86_64\android-ndk-r10e\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\bin>arm-linux-androideabi-addr2line -f -e D:\flash_anr_pc\libipcsdk.so 00031f75

_ZN15CP2PSessionData22p2p_session_data_writeEPcih

??:?

addr2line 命令及执行结果如上所示,-e参数指定文件名,-f参数显示函数名。只是得到了函数入口,详细运行信息没有。再使用objdump工具看下。

2)objdump

objdump可以将so库进行反汇编,反汇编后得到重定向文件,然后根据偏移地址得到更详细的函数调用上下文信息。

我实际使用ndk 20版本发现addr2line 运行可以,objdump总有一些错误,所以最后使用ndk 10命令执行成功。

D:\DJ_Software\Android\Ndk_Download\android-ndk-r10e-windows-x86_64\android-ndk-r10e\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\arm-linux-androideabi\bin>objdump -S -D D:\flash_anr_pc\libipcsdk.so > D:\flash_anr_pc\deassmble_libipc.log

命令执行结果就是将反汇编后的结果写入到D盘对应目录的deassmble_libipc.log文件里。

反汇编后结果分析

仍是重点分析前面提到的那3个函数。实际发现反汇编后不知为何得到的函数偏移地址总是比crash日志中的偏移地址小1。

IOTC_Session_WriteData函数

打开deassmble_libipc.log文件,搜索偏移地址“2a560”。

0002a51e :

2a51e: b5b0 push {r4, r5, r7, lr}

2a520: af02 add r7, sp, #8

2a522: b08a sub sp, #40 ; 0x28

2a524: 469c mov ip, r3

2a526: 4696 mov lr, r2

2a528: 460c mov r4, r1

···

2a560: f7ea ef62 blx 15428 <_zn15cp2psessiondata22p2p_session_data_writeepcih>

2a564: 9009 str r0, [sp, #36] ; 0x24

2a566: e7ff b.n 2a568

2a568: 9809 ldr r0, [sp, #36] ; 0x24

2a56a: b00a add sp, #40 ; 0x28

2a56c: bdb0 pop {r4, r5, r7, pc}

可以看到IOTC_Session_WriteData函数在2a560行(crash日志中是0002a561)调用了p2p_session_data_write函数,p2p_session_data_write函数是C++类中的成员函数,所以在汇编中的函数名与纯C函数的函数名有所区别。

p2p_session_data_write函数

00031e6c <_zn15cp2psessiondata22p2p_session_data_writeepcih>:

31e6c: b5f0 push {r4, r5, r6, r7, lr}

31e6e: af03 add r7, sp, #12

31e70: f84d bd04 str.w fp, [sp, #-4]!

31e74: b098 sub sp, #96 ; 0x60

31e76: 469c mov ip, r3

31e78: 4696 mov lr, r2

···

31f66: d923 bls.n 31fb0 <_zn15cp2psessiondata22p2p_session_data_writeepcih>

31f68: e7ff b.n 31f6a <_zn15cp2psessiondata22p2p_session_data_writeepcih>

31f6a: 9808 ldr r0, [sp, #32]

31f6c: f500 7067 add.w r0, r0, #924 ; 0x39c

31f70: a914 add r1, sp, #80 ; 0x50

31f72: 2209 movs r2, #9

31f74: f7e2 ea0c blx 14390

31f78: 9910 ldr r1, [sp, #64] ; 0x40

31f7a: 2901 cmp r1, #1

31f7c: 9005 str r0, [sp, #20]

31f7e: db09 blt.n 31f94 <_zn15cp2psessiondata22p2p_session_data_writeepcih>

可以看到实际的LoopBuffWrite函数调用在31f74行(crash日志中的00031f75)。

LoopBuffWrite函数

00023ce4 :

23ce4: b5d0 push {r4, r6, r7, lr}

23ce6: af02 add r7, sp, #8

23ce8: b08c sub sp, #48 ; 0x30

23cea: 4613 mov r3, r2

23cec: 468c mov ip, r1

23cee: 4686 mov lr, r0

···

23d64: 3a01 subs r2, #1

23d66: 4010 ands r0, r2

23d68: 4408 add r0, r1

23d6a: 990a ldr r1, [sp, #40] ; 0x28

23d6c: 9a08 ldr r2, [sp, #32]

23d6e: f7f0 ecde blx 1472c <__aeabi_memcpy>

23d72: 990b ldr r1, [sp, #44] ; 0x2c

23d74: 6809 ldr r1, [r1, #0]

23d76: 9a0a ldr r2, [sp, #40] ; 0x28

23d78: f8dd e020 ldr.w lr, [sp, #32]

中间部分代码省略,可以看到在23d6e行(crash日志中为00023d6f),也是差一行。LoopBuffWrite在此处执行了__aeabi_memcpy,估计是执行数据拷贝时发生了错误,再继续深入就需要对汇编语言有所了解。

最后,还有一个工具ndk-stack可以简化分析过程。使用参见

https://blog.csdn.net/u010144805/article/details/80763956

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

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

相关文章

产品经理应该具备的技能(2)如何做一个好的数据产品经理?

一、如何做一个好的数据产品经理&#xff1f; PD&#xff08;指产品经理&#xff0c;下同&#xff09;本身就是在做牛做马&#xff0c;关系圈异常复杂。数据PD也不例外。而且打交道的人更多。以下是我用PPT绘制的数据产品经理关系圈。如果你也做过 数据产品的产品经理&#xff…

C#取整函数Math.Round、Math.Ceiling和Math.Floor 【非原创,用来收藏,分享】

1.Math.Round&#xff1a;四舍六入五取偶 引用内容Math.Round(0.0) //0Math.Round(0.1) //0Math.Round(0.2) //0Math.Round(0.3) //0Math.Round(0.4) //0Math.Round(0.5) //0Math.Round(0.6) //1Math.Round(0.7) //1Math.Round(0.8) //1Math.Round(0.9) //1说明&#xff1a;对于…

谈谈一些有趣的CSS题目(十)-- 结构性伪类选择器

开本系列&#xff0c;谈谈一些有趣的 CSS 题目&#xff0c;题目类型天马行空&#xff0c;想到什么说什么&#xff0c;不仅为了拓宽一下解决问题的思路&#xff0c;更涉及一些容易忽视的 CSS 细节。解题不考虑兼容性&#xff0c;题目天马行空&#xff0c;想到什么说什么&#x…

基于linux的netfilter处理数据包的过程分析,基于Netfilter的网络数据包分析

前面的几篇文章我已经对Netfilter的大概的机制作了比较详细的介绍&#xff0c;这篇文章我就说一下如何分析网络数据包。我刚刚写了一个程序&#xff0c;程序的功能很简单&#xff0c;就是提取出网络数据包的源地址和改包所使用的网络协议&#xff0c;大家可以看看源代码&#x…

Java EE CDI程序化依赖关系消歧示例–注入点检查

在本教程中&#xff0c;我们将看到在注入Java EE CDI bean时如何避免程序依赖消除歧义。 我们已经在Jave EE依赖关系消除歧义示例中展示了如何避免CDI Bean中的依赖关系歧义消除。 在这里&#xff0c;我们将向您展示如何以动态方式避免依赖消除歧义。 我们将通过检查注入另一个…

机器学习算法整理(四)集成算法—随机森林模型

随机&#xff1a;数据采样随机&#xff0c;特征选择随机 &#xff08;数据采样&#xff0c;有放回&#xff09; 转载于:https://www.cnblogs.com/douzujun/p/8386930.html

CSS 布局入门

概述 Web 兴起之后&#xff0c;关于CSS的介绍和学习资料已经铺天盖地。 本文不涉及具体的CSS语法之类的&#xff0c;而是希望从初学者的角度&#xff0c;让没有接触或很少接触CSS的人能快速的了解 CSS 到底是什么以及如何使用。 什么是 CSS 了解一个概念&#xff0c;首先看到…

迷你搜索引擎–使用Neo4j,Crawler4j,Graphstream和Encog的基础知识

继续执行正在实现搜索引擎的Programming Collection Intelligence &#xff08;PCI&#xff09;的第4章。 我可能比做一次运动所咬的东西要多。 我认为&#xff0c; 与其一直使用本书中使用的普通关系数据库结构&#xff0c;不如说我一直想看看Neo4J&#xff0c;所以现在是时候…

linux人脸识别视频推流,RTMP推流协议视频智能分析/人脸识别/直播点播平台EasyDSS接口调用注意事项介绍...

TSINGSEE青犀视频目前推出了前端支持不同协议设备接入的视频智能分析平台&#xff0c;包括RTSP协议的EasyNVR、GB28181协议的EasyGBS&#xff0c;RTMP推流协议的EasyDSS&#xff0c;还有能够进行人脸识别、车牌识别的EasyCVR&#xff0c;这些平台均提供了视频转码分发的能力&am…

js高级写法

名称 一般写法优化取整(不四舍五入) parseInt(a,10); //Before Math.floor(a); //Before a>>0; //Before ~~a; //After a|0; //After 取整(四舍五入&#xff09; Math.round(a); //Beforenum.toFixed(0) a.5|0; //After未定义 undefined; //Before void 0; //After, 快…

IntersectionObserve API使用

why 之前图片懒加载的实现方法大多数为&#xff1a;给window添加scroll事件&#xff0c;滚动时获取元素的offset值&#xff0c;判断元素在viewport内的可见行。这样做的缺点是&#xff1a;频繁的计算dom节点的属性导致性能较差&#xff0c;对scroll绑定的回调函数进行节流能减少…

css小技巧(1)

1、-webkit-overflow-scrolling: touch; 解决ios滑动时无缓冲问题 2、::-webkit-scrollbar 设置ios滑动时是否显示滚动条 3、::selection 选中文字时文字颜色和选中色 <!doctype html> <html> <head> <meta charset"utf-8"> <meta cont…

在基于图论的Java程序中基于DSL的输入图数据的方法

我们大多数人已经编写了一些程序来处理图论算法&#xff0c;例如查找两个顶点之间的最短路径&#xff0c;查找给定图的最小生成树等等。 在这些算法的每一种中&#xff0c;表示图形的编程方式是使用邻接矩阵或邻接表 。 两者都不是定义图形输入的非常直观的方法。 例如&#xf…

linux 暴力删除文件,暴力删除文件

有些时候电脑上会有一些文件删除不了&#xff0c;例如&#xff1a;删除的时候&#xff0c;提示文件不存在&#xff0c;或者请求的安全信息不可用或无法显示。无法删除文件夹的原因:1.当文件夹中存在正在被占用的文件时,删除当然会失败。其中包括有一些病毒程序在运行时,删除文件…

Remmarguts' Date(POJ2449+最短路+A*算法)

题目链接&#xff1a;http://poj.org/problem?id2449 题目&#xff1a; 题意&#xff1a;求有向图两点间的k短路。 思路&#xff1a;最短路A*算法 代码实现如下&#xff1a; 1 #include <set>2 #include <map>3 #include <queue>4 #include <stack>5 …

点击文本框后页面变大

原因&#xff1a;HTML中默认是认为16px的字体&#xff0c;人才能看清楚&#xff0c;所以&#xff0c;当点击文本框的时候&#xff0c;当前文本框会以字体16px的大小显示&#xff08;即字体小于16px页面会变大&#xff09;。解决原理&#xff1a;设置文本框的的字体为16px&#…

通过外部文件覆盖打包的Spring应用程序属性文件

开发Spring应用程序时&#xff0c;最常见的用例是您希望拥有多个版本的配置属性&#xff0c;具体取决于要部署到的位置&#xff0c;例如&#xff0c;数据库URL或功能标志可能是特定于dev&#xff0c;qa&#xff0c;production等环境的。 像大多数Spring开发任务一样&#xff0…

usb3.0 linux无法识别,USB3.0接口不能识别U盘的解决方法

USB接口可以说是电脑的标配&#xff0c;现在基本上所有电脑都会搭载USB接口。而USB标准从1.0发展到现在的3.0&#xff0c;甚至更新的也已出来。不过&#xff0c;如果USB3.0无法识别U盘&#xff0c;那该怎么办呢?USB3.0是一种技术也是一种规范&#xff0c;现在很多笔记本都是默…

table 鼠标移上去改变单元格边框颜色。

表格定义了 border-collapse:collapse;边框会合并为一个单一的边框。会忽略 border-spacing 和 empty-cells 属性。用td:hover,显示不全 搜索了好久&#xff0c;没有找到好的方法&#xff0c;用左右边框也不完美。 于是就在想&#xff0c;移上去的时候给加个伪元素after&#…

PotPlayer安装与配置

目录 1.简介 2.安装 3.设置 基本选项设置&#xff1a; 播放选项设置&#xff1a; PotPlayer皮肤设置&#xff1a; 1.简介 PotPlayer一款小巧简单的视频播放软件&#xff0c;具有于强大的定制能力和个性化功能。 2.安装 官网下载 potplayer http://potplayer.daum.net/?langzh_…