您的位置:首页 > 移动开发 > Android开发

Android jni Crash堆栈信息分析

2016-06-27 21:15 260 查看
如何定位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依然是开发人员的首选。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: