Troubleshooting
   在开发阶段,logging让你决定和展示有利于解决问题关于应用程序的状态的信息。
通过logging的展示的信息对于Debugging很重要但是这是不够的,但是
应该知道错误发生在哪里。当面对这无法预期的错误时,错误
定位成为了一个拯救者。知道了正确的工具和技术使你能迅速的解决问题。
   栈追踪分析:
为了观察栈,你将安装一个bug在hello-jni实例应用程序中将引发程序
崩溃。使用Eclipse,打开着hello-jni.c的源文件。修改本地函数的
内容如下:
   static jstring func1( JNIEnv* env )
{
/* BUG BEGIN */
env = 0;
/* BUG END */
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
return func1(env);
}
通过设置JNIEnv的接口指针的值为0,你将触发这个崩溃。现在建立
和运行这个应用程序。当应用程序开始,点击Call本地方法来触发这
本地的功能。这应用程序崩溃,和一个栈的几率被展示在logcat中
如下:
   带有崩溃信号的开始行指示这栈的调用。#00的开始行是崩溃发生的
。接下的一行,#01,是上一个函数的调用,等等。在这PC的后面这
数子是代码的地址。正如在栈记录所看到的,这本地代码的崩溃在地址
000003c处,和上一个函数调用时stringFromJNI本地函数。这个000003c
地址本身可能不会告诉你太多,但是使用正确的工具这个地址能够
被用来发现真正的文件盒crash发生的行。Android NDK带有ndk-stack
工具能够把栈记录到真正文件的名字和行号。在命令行,进入项目根目录
,使用
   adb locat|ndk-stack -sym 0bj/local/armabi
这ndk-stack工具将翻译栈,如下。地址得到翻译到jni/hello-jni.c在
源文件33行。这些信息使错误定位更加容易。通过简单放置一个断点在
地址上你能够阻止应用程序和监听应用程序的状态。
   JNI的扩展检测:
默认情况下,JNI函数做非常少的错误检测。错误经常导致程序崩溃。Andoid
提供一个扩展的检测模式对于JNI调用,如CheckJNI。当开启下,JavaVM
和JNIENV接口指针转到了函数表来执行一个扩展水平的错误检测在调用
真正的实现前。CheckJNI能够侦测接下的问题:
   设法分配一个负数长度的数组
   Bad或NULL指针被传递给JNI函数
   当传递给类名时,语法错误
   当在critical部分是,JNI调用
   错误的参数当传递到NEWDirectByeBuffer
   当一个异常发生时JNI调用
   JNIEnv接口指针被用作错误线程
   Field类型和set<Type>Fiel函数不搭配
   函数类型和Call<Type>Method函数不搭配
   DeleteGlobalRef/DeleteLocalRef调用有错误引用类型
   错误的释放模式被传递到Release<Type>ArrayElement函数
   不兼容的错误类型返回从本地方法
   传递到一个JNI调用无效的UTF-8序列。
默认情况下,在模拟器上CheckJNI模式开启的,但是并不在常用的
Andoid设备上,由于它在系统性能的影响。
   开启ChckJNI:
   在一个regular设备上,使用命令行,你能够开启CheckJNI模式通过
使用:adb shell setprop debug.checkjni 1
   这并不影响着运行的应用程序但是任何应用程序开启向导使
CheckJni开启。CheckJNI状态被展示在logcat中,如下:
   jstring
   Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
   jobject thiz )
   {
       jintArray javaArray = (*env)->NewIntArray(env, -1);
       return (*env)->NewStringUTF(env, "Hello from JNI !");
   }
创建了一个负长度的整形数组。建立和运行应用程序在模拟器上。当
应用程序开启,点击Call本地按钮来触发本地方法。如下,CheckJNI将
展示一个警告信息在logcat和终止执行。

TroubleShoot相关推荐

  1. 安装中文语言包会导致 Troubleshoot Compatibility 失败

    Windows 7 Beta1 发布同时,还向大家提供了中文语言支持包.这样一来满足了那些英文水平不好或不喜欢使用英文界面的测试者,带来了很大的方便.gOxiA 英文水平也很差所以在第一时间装上了语言 ...

  2. Document TitleHow to troubleshoot Funds Check Hold Issues on Payables Invoices

    最近发票验证的时候 总是被系统自动加上HOLD :资金检查无法进行[@more@] Document TitleHow to troubleshoot Funds Check Hold Issues ...

  3. Troubleshoot QML Calls of functions that start with an uppercase letter should use ‘new‘. (M306)

    Troubleshoot QML Calls of functions that start with an uppercase letter should use 'new'. (M306) 原因 ...

  4. 学习MongoDB(Troubleshoot Replica Sets) 集群排除故障

    Test Connections Between all Members(集群中节点网络测试) 在进行Mongodb集群时,每个节点的网络都需要互动,假设有3个服务器节点. m1.example.ne ...

  5. troubleshoot之:用control+break解决线程死锁问题

    简介:如果我们在程序中遇到线程死锁的时候,该怎么去解决呢? 本文将会从一个实际的例子出发,一步一步的揭开java问题解决的面纱. 简介 如果我们在程序中遇到线程死锁的时候,该怎么去解决呢? 本文将会从 ...

  6. troubleshoot之:GC调优到底是什么

    文章目录 简介 那些GC的默认值 GC的选择 GC的最大线程个数 初始化heap size 最大的heap size 分层编译技术 我们到底要什么 最大暂停时间 吞吐率 简介 我们经常会听到甚至需要自 ...

  7. troubleshoot之:使用JFR分析性能问题

    文章目录 简介 GC性能事件 同步性能 IO性能 代码执行的性能 其他有用的event 简介 java程序的性能问题分析是一个很困难的问题.尤其是对于一个非常复杂的程序来说,分析起来更是头疼. 还好J ...

  8. troubleshoot之:分析OutOfMemoryError异常

    文章目录 简介 OutOfMemoryError java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: GC ...

  9. troubleshoot之:使用JFR解决内存泄露

    文章目录 简介 一个内存泄露的例子 使用JFR和JMC来分析内存泄露 OldObjectSample 总结 简介 虽然java有自动化的GC,但是还会有内存泄露的情况.当然java中的内存泄露跟C++ ...

最新文章

  1. 数据结构[单链表]操作大全(初始化,创建,插入,查询,删除,长度,输出)c++代码实现
  2. 《虚拟化与云计算》第4章 虚拟化的业界动态
  3. 01.移动先行之谁主沉浮----我的第一个程序
  4. 微前端之single-spa
  5. wxPython:登录工具
  6. ora-00923数据类型不一致_小白学 Python(2):基础数据类型(上)
  7. Git 分支管理-git stash 和git stash pop
  8. python if break_python_if_else,while,break
  9. 安装以及简单使用zookeeper
  10. SpringBoot : Spring容器生命周期管理:SmartLifecycle
  11. Linux btrfs之文件系统转换
  12. 黑马程序员入学基础测试(五)
  13. .NET中的异常处理机制(一)
  14. 计算机软件销售收入会计,嵌入式软件产品销售额如何计算
  15. 会计从业人员管理系统_湖南省会计从业人员网上服务大厅
  16. 【火炉炼AI】机器学习053-数据降维绝招-PCA和核PCA
  17. python基于pingouin包进行统计分析:使用tost函数执行配对的双单侧检验(TOST)、以dataframe的形式输出分析结果(包含p值、自由度、bound等)
  18. MySQL大表优化方案(推荐一)
  19. springboot 分布式 --- 慕课网
  20. mysql8找不到bir_Mysql大小写敏感问题

热门文章

  1. 2018年第九届蓝桥杯C/C++ A组国赛 —— 第四题:约瑟夫环
  2. 使用C++实现多张BMP图片转换为YUV动画----附加淡入淡出转场(逐渐变明变暗),及垂直滑像转场(逐行渐变)
  3. 深度学习、机器学习、机器人操作系统、人工智能学习资源
  4. python测试函数
  5. 【机器视觉】 dev_set_window_extents算子
  6. 【Linux】一步一步学Linux——od命令(266)
  7. 【Tools】C/C++开发SDK下载汇总
  8. 【Tools】gcc4.4升级到gcc4.8
  9. antd vue 树更新数据后不展开_很全面的vue面试题总结
  10. mysql 链接慢_mysql连接非常慢的觖决办法及其它常见问题解决办法