如何定位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依然是开发人员的首选。

Android jni Crash堆栈信息分析的更多相关文章

  1. C++ crash 堆栈信息获取(三篇文章)

    最近在做程序异常时堆栈信息获取相关工作,上一篇文章成功的在程序creash时写下了dump文件,而有些情况写dump文件是 不可以的,比如在jni开发时,C++只做底层处理,而整个项目是android ...

  2. C++ crash 堆栈信息获取

    最近在做程序异常时堆栈信息获取相关工作,上一篇文章成功的在程序creash时写下了dump文件,而有些情况写dump文件是 不可以的,比如在jni开发时,C++只做底层处理,而整个项目是android ...

  3. C++ crash 堆栈信息获取(三篇)

    最近在做程序异常时堆栈信息获取相关工作,上一篇文章成功的在程序creash时写下了dump文件,而有些情况写dump文件是 不可以的,比如在jni开发时,C++只做底层处理,而整个项目是android ...

  4. Android Tombstone/Crash的log分析和定位

    有一句话叫做常在河边走,哪有不湿鞋.我们这些研究和开发Android的project师正应了这句话,相必大家在调试的时候常常会遇到这么个东西吧 *** *** *** *** *** *** *** ...

  5. Android Native crash日志分析

    在Android应用crash的类型中,native类型crash应该是比较难的一种了,因为大家接触的少,然后相对也要多转几道工序,所有大部分对这个都比较生疏.虽然相关文章也有很多了,但是我在刚开始学 ...

  6. 还原堆栈信息,分析地形系统使用ASTC格式的纹理导致Crash的问题

    0x00 前言 在这篇文章中,我们选择了过去一周Unity官方社区交流群中比较有代表性的几个问题,总结在这里和大家进行分享.主要涵盖了IL2CPP.Scripting.Virtual Reality. ...

  7. Android Native/Tombstone Crash Log 详细分析(转)

    转自:http://weibo.com/p/230418702c2db50102vc2h Android 虽然已经有好几年了,但是NDK的开放速度却非常缓慢,所以目前网络上针对对Android Nat ...

  8. 获取Android崩溃crash信息并写入日志发送邮件

    一.实现Thread.UncaughtExceptionHandlerUnChecked异常发生时,由于没有相应的try…catch处理该异常对象,所以Java运行环境将会终止,程序将退出,也就是我们 ...

  9. Java内存泄漏分析系列之一:使用jstack定位线程堆栈信息

    原文地址:http://www.javatang.com 前一段时间上线的系统升级之后,出现了严重的高CPU的问题,于是开始了一系列的优化处理之中,现在将这个过程做成一个系列的文章. 基本概念 在对J ...

随机推荐

  1. Windows10远程报错:由于CredSSP加密Oracle修正导致远程失败

    解决方案:Windows 10 家庭版,没有 gpedit.msc,只能修改本地电脑的注册表,在本地“运行”输入: regedit   按以下目录进入:HKEY_LOCAL_MACHINE\Softw ...

  2. adjustResize模式下ExpandaleListView中输入框焦点错乱及布局底部的导航栏被顶在键盘上方的处理

    为了更好的用户体验,煎熬了许久,得到这么个解决方案.在此记录下来,以供后来者参考. 第一部分 清单文件中组件activity的android:windowSoftInputMode属性值的含义: [A ...

  3. 回文数(vector的使用)

    问题描述一个正整数,如果交换高低位以后和原数相等,那么称这个数为回文数.比如 121,2332 都是回文数,134567 不是回文数. 任意一个正整数,如果其不是回文数,将该数交换高低位以后和原数相加 ...

  4. 运用SqlSugar框架+Axios写的增删查案例

    使用SqlSugar框架需要引用NuGet程序包否则会出现报错. 前台页面创建代码: @{    ViewBag.Title = "Index";}<h2>Index& ...

  5. 分布式存储ceph理论

    一.ceph简介 Ceph是一种具有优秀性能,可靠性和可扩展性,统一的分布式文件系统.ceph 的统一体现在可以提供文件系统.块存储和对象存储,分布式体现在可以动态扩展.在国内一些公司的云环境中,通常 ...

  6. ZOJ4043 : Virtual Singers

    将所有$A$和$B$混在一起排序,那么每个$B$要匹配一个$A$,从左往右依次考虑每个数: 如果是一个$B$: 如果左边没有多余的$A$,那么将其放入堆$q_C$中,表示这个$B$还未匹配. 否则选择 ...

  7. go语言数据库操作, gorm框架

    type User struct{ ID uint `gorm:"primary_key"` Name string Age int Birthday time.Time AddT ...

  8. BZOJ 4665

    orz gery 一发rk1真有趣(其实我没想着常数优化 inline int sqr(int x){return 1ll*x*x%mo;} const int N=2011; int n,a[N], ...

  9. String.matches()的用法

    https://blog.csdn.net/victoryckl/article/details/6930409

  10. docker安装,无法正常启动

    报错信息: Job for docker.service failed because the control process exited with error code. See "sy ...