Android jni Crash堆栈信息分析

如何定位Android NDK开发中遇到的错误

    NDK编译生成的.so文件作为程序的一部分,在运行发生异常时同样会造成程序崩溃。不同于Java代码异常造成的程序崩溃,在NDK的异常发生时,程序在Android设备上都会立即退出,即通常所说的闪退,而不会弹出“程序xxx无响应,是否立即关闭”之类的提示框。

    NDK是使用C/C++来进行开发的,熟悉C/C++的程序员都知道,指针和内存管理是最重要也是最容易出问题的地方,稍有不慎就会遇到诸如内存无效访 问、无效对象、内存泄露、堆栈溢出等常见的问题,最后都是同一个结果:程序崩溃。例如我们常说的空指针错误,就是当一个内存指针被置为空(NULL)之后 再次对其进行访问;另外一个经常出现的错误是,在程序的某个位置释放了某个内存空间,而后在程序的其他位置试图访问该内存地址,这就会产生无效地址错误。 常见的错误类型如下:

初始化错误;
访问错误;
内存泄露;
参数错误;
堆栈溢出;
类型转换错误;
数字除0错误。

1、第一种方法:ndk-stack
adb shell logcat|ndk-stack -sym $PROJECT_PATH/obj/local/armeabi

或者先获取日志再分析
adb shell logcat > log.txt
ndk-stack -sym $PROJECT_PATH/obj/local/armeabi -udmp log.txt

2、第二种方法:使用addr2line和objdump命令
这两个方法可以揭示ndk-stack命令的工作原理是什么

arm-linux-adnroideabi-addr2line -e obj/local/armeabi/*.so 地址    :定位行数
arm-linux-adnroideabi-addr2line -f -e obj/local/armeabi/*.so 地址 :定位函数信息

3、第三方SDK

TestFlight——完美的iOS app测试方案:http://onevcat.com/2012/01/testflight/

国外的crittercism
国内的TestinTestin:收费
TestFlight——完美的iOS app测试方案

崩溃报告类:
Crittercism 个人用了一段时间,表现很稳定,但是版本更新时设置比较麻烦
Crashlytics 相当优雅方便,最近被Twitter收购。十分推荐

用户行为统计类:
Flurry 这个太有名了,不多说了
Countly 好处是轻量开源,数据可以自己掌控

Bugsense

但是在“发布前”测试分发这个环节上,基本还没有出现能与TestFlight相匹敌的服务出现,因此如果有这方面的测试需求的话,TF依然是开发人员的首选。

如果您觉得文章不错,不妨给个打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!! 

 

  


很重要--转载声明

  1. 本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords
  2. 如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。 

posted @ 2016-06-27 21:15  朝十晚八  阅读(4209)  评论(0编辑  收藏  举报

返回顶部