首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android Native Crash问题排查思路

背景:定位难 对于Android APP而言,nativeCrash相比于Java层更难捕获与定位,因为so的代码通常不可见,而且,一些第三方so的crash或者系统的更难定位,堆栈信息非常少:参考下面的几个...如何定位native crash 对于Crash而言,精确的定位等于成功的一半。...如何通过工具定位到native crash呢,如果是自己实现的so库,一般而言还是会有相应的日志打印出来的,本文主要针对一些特殊的so,尤其是不存在源码的so,对于这种场景如何定位,最重要当然还是复现:.../lib64/bionic/libc.so (__start_thread+64) (BuildId: 1eb18e444251dc07dff5ebd93fce105c) #22帧开始看出这个是一个ART.../ndk/guides/ndk-stack 作者:看书的小蜗牛 原文链接: Android Native Crash问题排查思路

1.4K10
您找到你想要的搜索结果了吗?
是的
没有找到

写了个 AS 插件:SmartNDKStack,快速定位 Android Native 开发 Crash

对于Android Native开发的人员而言,可能经常会在开发过程及线上环境中遇到Native Crash的问题,对于这类native crash,我们一般都会直接addr2line,或使用ndk中附带的...A/DEBUG: #00 pc 00000000000c5008 /apex/com.android.runtime/lib64/bionic/libc.so (tgkill+8) (BuildId...A/DEBUG: #02 pc 000000000013ced4 /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline...==/lib/arm64/libndkdemo.so crash地址相对于库的偏移是0xf0c8 crash地址在函数Java_com_example_ndkdemo_MainActivity_stringFromJNI...如何解析 常规操作 addr2line -Cfie libndkdemo.so 0xf0c8 网上的大部分教程都是直接进行如上的addr2line操作,对于自己开发过程中直接运行出现了crash的确可以快速定位

2.2K60

阿里开源 Patrons:大型 32 位 Android 应用稳定性提升50%的“黑科技”

根据观察到的线上 Crash 情况,可以发现 Native Crash 的 Top 10 中有大量的 libc abort,也就是信号 6,典型的特征就是在 Crash 堆栈中可以发现地址空间的总和接近...通过同样的套路,就可以破解 dlsym 了,也就能够完成 libart.so 的加载。 第二个问题就是如何通过找到各个属性相对于实例的偏移呢?...50x14 Patrons 实战效果 Patrons 方案在阿里集团内部推出之后,某航旅类应用首先完成了接入,新版本上线后,Native Crash 率下降了 80%。...后续其他头部应用也陆续完成了接入,某电商类应用 Native Crash 下降了 78.6%。...经过一段时间的统计,接入 Patrons 的集团头部应用,Native Crash 平均下降了接近 50%,大幅度提升了应用的稳定性,让客户用起来更加稳定放心。

63030

全民K歌内存篇3——native内存分析与监控

观察Crash监控平台发现Crash率也在逐步升高,其中Native层的Top1的crash堆栈信息如下: ?...那么,该如何系统的分析和解决Native内存问题呢? 二、问题分析 2.1 为什么会内存不足 Android系统是基于Linux之上的,在内存管理上基本一致,但也有差异。简化后如下图所示: ?...2)、内存分量分析工具 经过调研发现,Android分析native层内存工具,有Android原生支持的,也有开源的。...1、无需开发;2、能够还原部分系统堆栈; 1、仅Android10以上支持;2、分析结果无法准确识别业务问题; loli_profiler hook libc.so的malloc,free等函数; 1、...3.4、实现So库内存分析的基本方案 1)、如何分析So库内存的申请和释放 如下图,通过hook系统库libc.so的malloc和free函数,业务所有的申请和释放操作也就都变成可见了。

5.2K32

自动识别Android不合理的内存分配

我们只需要关注DdmVmInternal是怎么做的即可,很幸运,Android系统源码的一段测试代码直接告诉了我们如何反射调用DdmVmInternal提供的能力,源码位置在/...突破 DdmVmInternal的实现是放在native层的,顺藤摸瓜,我们找到了虚拟机里实现内存分配录制的源码,此处是Android5.1的源码,其他版本有差异,后面会讲到。 ?....x及以上版本,我们来看看这些问题如何各个击破。...这图IDA打开一个Android7.1的libart.so查到的RecordAllocation函数的二进制。...参考文章 ART运行时为新创建对象分配内存的过程分析 如何获取Android系统中申请对象的信息 AllocationTracker实践篇 Android Arm Inline Hook Android

5.1K3625

如何调试Android Native Framework

半年前写了一篇文章,介绍 如何调试Android Framework,但是只提到了Framework中Java代码的调试办法,但实际上有很多代码都是用C++实现的;无奈当时并并没有趁手的native调试工具...本文将带来Android Framework中native代码的调试方法。 在正式介绍如何调试之前,必须先说明一些基本的概念。...编译器在编译libart.so的时候,记录下了编译时候源代码与代码偏移之间的对应关系,因此调试器可以调试符号文件中获取到源码行号信息;如下: ?...调试这一系列的文章,时间跨度长达一年;Java到C/C++再到汇编级别的调试,有源码到无源码,Application层到Framework层,任何代码都可以进行调试。...好在最后终于一一解决,可以睡个安稳觉了 ~_~ Android Studio你不知道的调试技巧 如何调试Android Framework 如何调试Android Framework Native

3.6K20

Android远程调试的探索与实现

先看下如何实现自定义JDWP通道。 JDWP启动过程 我们看下Android 5.0系统在启动一个应用时是如何启动JDWP Thread的。...Hack-Native-JDWP 通过阅读JDWP启动源码(Android-API-21)发现,要想让JDWP通过自定义的Socket通道进行通信,需要满足两个条件: 能够修改全局变量gJdwpOptions...但从 Android 7.0 开始,系统将阻止应用动态链接非公开 NDK库,详情请参考《Android 7.0行为变更》,强制调用会产生如下Crash: java.lang.UnsatisfiedLinkError...e2d50000开始。...如何找到这些Section: 通过内存映射的方式把libart.so映射到内存中; 按照ELF文件结构解析映射到内存中的libart.so; 解析SHT_DYNSYM,并把当前section复制到内存中

2K30

React Native实践有感

RN需要JS的运行环境来解释执行JS编译之后的bundle文件,在Android端使用了webkit官方开源的jsc.so,此外还有很多其它的so调用,比如Android系统的libc.so。...一些crash问题就是由动态链接库造成的,可能跟用户本身设备系统版本和webview版本有关,系统库导致的crash也没有堆栈信息,因此这些问题很难定位原因,比如libc.so导致的crash。...Crash问题的追踪我们的项目中使用了Firebase crashlytics来统计分析crash log,Firebase console可以看到,JS端的exception都会通过RN原生代码抛出...Nativecrash则分别按照Android和iOS平台的方式去定位,比如Android上传native debug symbol到Google play console,iOS上传dSYM文件到Firebase...如何转换webp图片可以看google官方文档。像Android项目中的大尺寸图片如splash启动页就可以转换成webp格式,可以大幅减小图片所占空间。

2.4K10
领券