

Android Crash之Native Crash分析
source link: http://yuanfentiank789.github.io/2018/09/16/Android-Crash%E4%B9%8BNative-Crash%E5%88%86%E6%9E%90/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

上一篇给大家介绍了Android Crash中的Java Crash分析,我们可以知道Java Crash一般会弹出提示框告诉我们程序崩溃了,通常使用Crash工具都能够捕获到;本篇博客来谈谈如何针对Native Crash进行分析,它相对与Java层面的Crash有什么特点?如何判断程序Crash是因为Native层导致的?我们怎么去分析它?下面我们一个一个解答这些问题。
Native Crash在Android上的特点
- 出错时界面不会弹出提示框提醒程序崩溃(Android 5.0以下)
- 出错时会弹出提示框提醒程序崩溃(Android 5.0以上)
- 程序会直接闪退到系统桌面
- 这类错误一般是由C++层代码错误引起的
- 绝大部分Crash工具不能够捕获
我们在实际Android开发的时候,可能会引入第三方的一些so库或者自己开发相应的so库供程序使用,然而so库一般是通过c或者c++开发的。Android开发者通过java层的JNI机制调用Native语言写的函数,然而Natice语言也可以调用java层的函数。 如果有同学不明白的话,建议先去了解下JNI的相应技术,总的来说通过JNI技术,就让我们让Java世界跟Native世界可以联系在一起,也因为这个特性,让Java具有跨平台的特性。
如果想了解如何通过Android Studio制作so库,笔者前面的一篇文章可以帮到你:http://blog.csdn.net/wwj_748/article/details/51274580
Native Crash是如何产生的?
上一节我们谈到so库是同通过Native语言开发的,自然在Android中使用so库的时候发生的Crash,就是我们所说的Native Crash。为了更好的让大家知道Native Crash是如何产生的,下面笔者举一个例子:
Java层定义Native方法
本地方法跟普通的Java方法的区别在于方法声明多了native关键字。
JNI层实现Native方法
这里我们制造一个Native Crash,空指针异常。
通过Java调用Native方法
要调用Native方法需要先加载我们开发好的so库,通过System.loadLibrary(“so名字”);来调用,然后在通过java调用声明的native方法。
Native Crash如何分析?
既然要分析就必须找到可以分析的东西,我们在分析Java层Crash的时候是通过logcat日志找到对应的出错代码,然而Native层Crash也是可以logcat日志来进行分析的。
这里我们截取上面制造的crash在logcat显示的日志:
这个是什么鬼,看不懂啊有木有。这个出错信息是我们调用native函数时打印出来的日志,只是简单的描述出错信号,出错地址还有进程号,看这个是完全摸不着调的。不过系统还是会提供相关有用的日志,我们在Android Studio查看logcat的时候需要做一下过滤。
在logcat添加完”DEBUG”的过滤项之后,我们就能得到以下log:
这下子可分析的内容就多起来了,我们逐个来看看:
- 进程信息:pid表示进程号,tid表示线程号,name表示进程名
- 错误信号:signal 11表示信号的数字,SIGSEGV表示信号的名字,code 1(SEGV_MAPERR)表示出错代码,fault addr 00000000 表示出错的地址。
- 寄存器快照:进程收到错误信号时保存下来的寄存器快照,一共有15个寄存器。
- 堆栈信息:##00表示栈顶,##01调用#00,以此往下都是嵌套的调用关系,直至到栈顶。
这里参考了:http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=27&extra=page%3D4
我们在栈顶就已经看到我们出错的地方了:
#00 pc 00000730 /data/app-lib/com.devilwwj.jnidemo-1/libJNIDemo.so (Java_com_devilwwj_jnidemo_TestJNI_createANativeCrash)
pc 00000730 表示出错的地址,后面可以看到我加载了libJNIDemo.so库,接着是我们前面声明的Native方法,通过这种方法我们就能准确的找到出错的地方。
从上面的分析我们可以看到,so库崩溃时会产生信号异常,如果我们能够捕获到信号异常,相当于我们也能够顾捕获到Android Native崩溃了。
关于Native Crash的特点、产生原因、分析过程已经给大家做了简单的分析,这一块内容是初学者在分析错误的时候最头痛的地方,因为他不知道如何下手,也希望通过这篇文章能帮助到大家对Native Crash分析有个初步的认识,关于这一块还有很多东西可以讲,比如具体的signal有哪些,Linux下的信号机制是怎样的,怎样才能够捕获到信号等等,关于Native层的Crash捕获,我们有没有第三方的开发工具能帮助到我们,这里就要隆重推荐大家使用Bugly,可以说是业内领先的崩溃捕获工具,不仅能够帮助我们获取到完整的错误堆栈,还能够将出错的上下文环境参数(比如系统版本、设备信息、内存信息等)详细的展现出来,大家不妨可以尝试下。最后,感谢大家的阅读。
Recommend
-
37
本篇核心讲解了自己实现一个 Android Native Crash 收集的方案步骤,重点问题解决办法。 对本文有任何问题,可加我的个人微信:kymjs123 在 Android 平台上,Native Crash 一直是比较麻烦的问题,因为捕获麻...
-
24
翻译自苹果官方文档:Understanding and Analyzing Application Crash Reports nimo: 这篇长达1w多字的文章,大概前后翻译了一个月,“写”了三遍:第一遍是直译,第二遍是把直译改成程序员看着舒服的“行话”,
-
32
应用崩溃是影响 APP 体验的重要一环, 而崩溃定位也常常让开发者头疼。本文就讲讲关于 Crash 分析的那些事。 Crash 日志的渠道
-
12
nodejs crash如何分析和定位自己团队(腾讯/看点/搜索)长期招聘web前端、c++后台、搜索/推荐算法,欢迎来撩,[email protected]。---------------------------------------...
-
6
既然都来了,你知道为什么app会crash吗? android main入口的commonInit()方法内处,有这么一句话, Thread.setDefaultUncaughtExceptionHandler(new KillApplicationHandler(loggingHandler)); 如果没...
-
8
背景:高德地图车机版运行的车载系统环境绝大部分都是基于安卓的定制系统,且高德车机版底层代码均为C/C++ Native代码。因此,在安卓上需要有一种通用的Native内存性能分析方案。内存塔(MemTower)是一个基于开源项目memory-profiler并移植...
-
9
作者:孟嵩,腾讯高级开发工程师商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。原文链接:http://wetest.qq.com/lab/view/404....
-
6
The Android app using OData WCF - The Android app continues to crash advertisements I am fairly new to Android development and I am trying to creat...
-
2
什么是jvm crash Symptoms include: webapps are completely unavailable. The Java process isn’t even running. It was not shut down manually. Files with names like hs_err_pid20929.log...
-
7
unity native crash —— 横竖屏切换导致的crash 作者: 邹成卓 2022-11-30 22:36:39 分类:
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK