背景:定位难 对于Android APP而言,native层Crash相比于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问题排查思路
作者简介:dc, 天天P图AND工程师 ---- Android上比较常见的问题除了ANR、Java Crash还有Native Crash,尤其是像天天P图这样的具备拍摄能力的APP,使用了大量native...Android ART发现或出现异常; 4. 其他framework、Kernel或硬件bug; 2. Native Crash日志长什么样? 一个典型的Native Crash日志如下: ?...Native Crash的类型 从常见的调用栈中,我们也可以看到Native Crash的一般类型: 1. Abort:Abort一般是Runtime通过libc主动进行的中止操作; 2....如何分析Native Crash?...下面我们看看如何让gdb连接上的native代码。步骤分为以下4部分: 1.
对于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的确可以快速定位
: #00 pc 00019178 /system/lib/libc.so (syscall+28) native: #01 pc 000b3e35 /system/lib/libart.so (_...: #00 pc 0004a4d0 /system/lib/libc.so (__epoll_pwait+20) native: #01 pc 0001bcd5 /system/lib/libc.so...(epoll_pwait+60) native: #02 pc 0001bd05 /system/lib/libc.so (epoll_wait+12) native: #03 pc 00010407...直接看第一行native信息: native: #00 pc 0004a4d0 /system/lib/libc.so (__epoll_pwait+20) epoll_wait其实是native层用于实现等待的...层其实各有一个MessageQueue,Java层的MessageQueue实际上是从Native层去获取其中的消息。
JNI多线程: 我们经常遇到的一个场景是,在JNI中可能会开启一个线程,如何回调到Java层来?...=JNI_OK) { LOGI("%s DetachCurrentThread error failed ",__FUNCTION__); } 音视频开发中,会遇到很多Native Crash问题...,下面介绍一种非常常见的JNI异常问题,具体堆栈如下: #00 pc 0000000000089908 /apex/com.android.runtime/lib64/bionic/libc.so (abort.../lib64/bionic/libc.so (_ZL15__pthread_startPv+64) #18 pc 000000000008bb0c /apex/com.android.runtime/lib64...我们先分析一下这个Crash的源头就不难得到这个结论了。 推荐一个android源码查询的站点cs.android.com,下面分析一下GetObjectClass调用链路。
众所周知,WebView 具有跨端运行的优势,大多场景下无需跟随 App 发版,最新内容渗透率明显高于 Native,这使得 WebView 的应用场景越来越多。...WebView 导致的 Crash 也占据较大比例,有效治理 WebVi ew 导致的 Crash 迫在眉睫。 本文主要讲述 Android WebView 常见 Crash 及解决方案。...7437) 8 java.lang.reflect.Method.invoke(Native Method) 9 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run...sp 89219060 lr a4ec18bd pc a4ebb40e cpsr 200b0030 backtrace: #00 pc 0001a40e /system/lib/libc.so...pc 0041fe2d /system/lib/libart.so (android::base::LogMessage::~LogMessage()+452) #03 pc 0024e545
一、背景 在Android平台,native crash一直是crash里的大头。native crash具有上下文不全、出错信息模糊、难以捕捉等特点,比java crash更难修复。...四、捕捉native crash 1.注册信号处理函数 第一步就是要用信号处理函数捕获到native crash(SIGSEGV, SIGBUS等)。...九、获得java堆栈 如何获得native crash所对应的java层堆栈,这个问题曾经困扰了我一段时间。...针对某些具体的native crash还做了业务上的处理,例如遇到热补丁框架相关的crash时就回滚补丁。.../lib/libc.so (__libc_android_abort+36) #04 pc 0000f554 /system/lib/libc.so (abort+4) #05 pc 00239885
(tgkill+12) #01 pc 00041f59 /system/lib/libc.so (pthread_kill+32) #02 pc 0001ba6f /system/...lib/libc.so (raise+10) #03 pc 00018c11 /system/lib/libc.so (__libc_android_abort+34) #04 pc...com.ace.test-1/lib/arm/libflutter.so (offset 0x122000) (JNI_OnLoad+764) #07 pc 00250143 /system/lib/libart.so...112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEP8_jobjectPS9_+1174) #08 pc 002c2027 /system/lib/libart.so...(ActivityThread.java:5527) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit
如何识别C++编译以后的函数名(demangle) C/C++语言在编译以后,函数的名字会被编译器修改,改成编译器内部的名字,这个名字会在链接的时候用到。...SIGABRT的可能原因 3种可能 1、double free/free 没有初始化的地址或者错误的地址 2、堆越界 3、assert ID: 虚拟机分配的唯一的线程ID,在Dalvik里,它们是从3...: art/runtime/java_vm_ext.cc:470] native: #03 pc 00238243 /system/lib/libart.so (_ZN3art9JavaVMExt9JniAbortFEPKcS2...F art : art/runtime/java_vm_ext.cc:470] native: #05 pc 003f0bcb /system/lib/libart.so (_ZN3art25JniMethodEndWithReferenceEP8...介绍及如何在Android中开启和使用来分析Crash等问题,coredumpandroid
根据观察到的线上 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%,大幅度提升了应用的稳定性,让客户用起来更加稳定放心。
A/DEBUG: #02 pc 0000000000140350 /apex/com.android.runtime/lib64/libart.so (art_quick_generic_jni_trampoline...A/DEBUG: #03 pc 0000000000137334 /apex/com.android.runtime/lib64/libart.so (art_quick_invoke_stub...A/DEBUG: #03 pc 0000000000137334 /apex/com.android.runtime/lib64/libart.so (art_quick_invoke_stub...native crash....:15:5 #02 0x0000000000140350 /apex/com.android.runtime/lib64/libart.so (art_quick_generic_jni_trampoline
观察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函数,业务所有的申请和释放操作也就都变成可见了。
/system/lib/libc.so 动态库 , 拷贝到 /sdcard/Pictures/lib/ 目录中 ; 首先 , 在 /sdcard/Pictures/ 目录下创建 lib 目录 ; mkdir.../sdcard/Pictures/lib 然后 , 将 /system/lib/libc.so 动态库 , 拷贝到 /sdcard/Pictures/lib/ 目录中 ; cp /system/lib.../libc.so /sdcard/Pictures/lib/ 拷贝后 , 可以从 SD 卡中 , 将 libc.so 动态库拷贝出来 ; 注意 , 获取动态库后 , 32 位的动态库要使用 32 位的...libchrome.so libjavacrypto.so libpower.so libstatslog.so android.hardware.cas.native...@1.0.so libart.so libeffectsconfig.so libmediametrics.so
我们只需要关注DdmVmInternal是怎么做的即可,很幸运,Android系统源码的一段测试代码直接告诉了我们如何反射调用DdmVmInternal提供的能力,源码位置在/...突破 DdmVmInternal的实现是放在native层的,顺藤摸瓜,我们找到了虚拟机里实现内存分配录制的源码,此处是Android5.1的源码,其他版本有差异,后面会讲到。 ?....x及以上版本,我们来看看这些问题如何各个击破。...这图IDA打开一个Android7.1的libart.so查到的RecordAllocation函数的二进制。...参考文章 ART运行时为新创建对象分配内存的过程分析 如何获取Android系统中申请对象的信息 AllocationTracker实践篇 Android Arm Inline Hook Android
半年前写了一篇文章,介绍 如何调试Android Framework,但是只提到了Framework中Java代码的调试办法,但实际上有很多代码都是用C++实现的;无奈当时并并没有趁手的native调试工具...本文将带来Android Framework中native代码的调试方法。 在正式介绍如何调试之前,必须先说明一些基本的概念。...编译器在编译libart.so的时候,记录下了编译时候源代码与代码偏移之间的对应关系,因此调试器可以从调试符号文件中获取到源码行号信息;如下: ?...调试这一系列的文章,时间跨度长达一年;从Java到C/C++再到汇编级别的调试,从有源码到无源码,从Application层到Framework层,任何代码都可以进行调试。...好在最后终于一一解决,可以睡个安稳觉了 ~_~ Android Studio你不知道的调试技巧 如何调试Android Framework 如何调试Android Framework Native
先看下如何实现自定义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复制到内存中
但是Native程序crash了,很少有做处理的,几个方面原因: 大部分应用不用C/C++编写,或者说用也只是很小的一个模块。...编写一个高质量的Native crash工具本身就不是很容易,搞不好自己还引发崩溃:( 。 正题 今天发现了Google开源了一个工具:breakpad,研究了一下,感觉不错的,特意分享一下。...breakpad工作原理 breakpad并不是只针对Android,而是一个全平台的C/C++程序的崩溃日志收集工具,适配了Windows/MacOX/Linux,当然也支持了Android。...crash() [native-lib.cpp : 13 + 0x2] r0 = 0x00000000 r1 = 0x00000001 r2 = 0xbef0d46c r3...0x40103000 - 0x40149fff libc.so ???
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原生代码抛出...Native的crash则分别按照Android和iOS平台的方式去定位,比如Android上传native debug symbol到Google play console,iOS上传dSYM文件到Firebase...如何转换webp图片可以看google官方文档。像Android项目中的大尺寸图片如splash启动页就可以转换成webp格式,可以大幅减小图片所占空间。
当一个动态库(native程序)开始执行时,系统会注册一些连接到 debuggerd 的signal handlers。...当 Linux 应用程序在执行时发生严重错误,一般会导致程序 crash。...其中,Linux 专门提供了一类 crash 信号,在程序接收到此类信号时,缺省操作是将 crash 的现场信息记录到 core 文件,然后终止进程。...我们可以使用它来分析我们的log文件 ndk-stack -sym xxx.so -dump logfile 所以我们在调试android系统源码的时候也可以直接分析log中的crash信息。...crash info from stdin" f = sys.stdin else: print "Searching for native crashes in %s" % arguments
当然定位 Native 层代码问题最优的方式还是通过 IDE(AS、VS)或者 GDB 进行 debug 断点调试,本文针对的是使用第三方 C/C++ SDK 出现 crash 的场景。...-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-addr2line.exe 执行 crash 代码得到的 crash...: backtrace: 01-03 16:17:14.165 17273 17273 F DEBUG : #00 pc 000000000001b518 /system/lib64/libc.so...以上 backtrace 中,从 #00 到 #03 共 4 行信息表示 crash 时函数调用关系,调用关系为从下往上,即 #03 调用了 #02 的方法,以此类推, #00 行告诉我们是拷贝字符串时遇到了问题...实际上从 log 中可以看到 AndroidStudio 自动帮我们做了这件事。
领取专属 10元无门槛券
手把手带您无忧上云