jni调试最蛋疼的就是signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x4这种错误,爆出来完全不知道是哪句代码造成的,很难定位到问题所在,网上很多人说是内存原因,还有说是空指针,不一而论。

我的错误是这样的:

02-16 14:54:53.041 20897-20897/? I/AEE/AED: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x4

02-16 14:54:53.058 20897-20897/? I/AEE/AED: r0 00000001 r1 00000002 r2 00000000 r3 0000002f

02-16 14:54:53.058 20897-20897/? I/AEE/AED: r4 00000000 r5 f4489000 r6 f4400000 r7 f6fb3c0c

02-16 14:54:53.058 20897-20897/? I/AEE/AED: r8 f48000c0 r9 f6fb3c0c sl 00000001 fp 00000002

02-16 14:54:53.058 20897-20897/? I/AEE/AED: ip f6fb3c24 sp dc144060 lr 00000000 pc f6f7f566 cpsr 600f0030

02-16 14:54:53.059 20897-20897/? I/AEE/AED: backtrace:

02-16 14:54:53.059 20897-20897/? I/AEE/AED: #00 pc 00042566 /system/lib/libc.so (je_arena_dalloc_bin_locked+365)

02-16 14:54:53.059 20897-20897/? I/AEE/AED: #01 pc 0004fa0b /system/lib/libc.so (je_tcache_bin_flush_small+234)

02-16 14:54:53.059 20897-20897/? I/AEE/AED: #02 pc 0004a33f /system/lib/libc.so (ifree+446)

02-16 14:54:53.059 20897-20897/? I/AEE/AED: #03 pc 00035775 /data/app/我的包名-1/lib/arm/libjni-lib.so (std::__ndk1::basic_string, std::__ndk1::allocator >::~basic_string()+148)

02-16 14:54:53.059 20897-20897/? I/AEE/AED: #04 pc 00086087 /data/app/我的包名-1/lib/arm/libjni-lib.so (WPZHandler::OnRspQryPosition(TradingLibFast::RspQryPositionResponse*)+2518)

02-16 14:54:53.059 20897-20897/? I/AEE/AED: #05 pc 0004451d /data/app/我的包名-1/lib/arm/libjni-lib.so (TradingLibFast::TLClient::HandleMessage(TradingLibFast::Message&)+964)

02-16 14:54:53.059 20897-20897/? I/AEE/AED: #06 pc 00041083 /data/app/我的包名-1/lib/arm/libjni-lib.so (TradingLibFast::TLClient::RecvFun()+226)

02-16 14:54:53.059 20897-20897/? I/AEE/AED: #07 pc 00066cfb /data/app/我的包名-1/lib/arm/libjni-lib.so (fastdelegate::FastDelegate0::operator()() const+94)

02-16 14:54:53.059 20897-20897/? I/AEE/AED: #08 pc 00066889 /data/app/我的包名-1/lib/arm/libjni-lib.so (TradingLibFast::TLThread::ProcessInThread()+68)

02-16 14:54:53.059 20897-20897/? I/AEE/AED: #09 pc 00066837 /data/app/我的包名-1/lib/arm/libjni-lib.so (TradingLibFast::ThreadFunc(void*)+26)

02-16 14:54:53.059 20897-20897/? I/AEE/AED: #10 pc 00017003 /system/lib/libc.so (__pthread_start(void*)+30)

02-16 14:54:53.059 20897-20897/? I/AEE/AED: #11 pc 0001506f /system/lib/libc.so (__start_thread+6)

然后就是nativeCrashListener,这个log其实已经很清晰了,记得一定不要过滤,选择no Filters,日志级别选择Verbose最低级别,这样才能看到最全的log信息。je_arena_dalloc_bin_locked显示就是内存处理出问题了,jni代码出问题导致了系统错误。再往下包含“我的包名”的log信息就显示了错误的具体位置,越上面就是越具体的位置,越下面范围就越广,这里大致就定位了问题代码大概在哪几行。不过这几行我纠结了许久,因为觉得没有问题,闪退只是偶现,后来看到另外一篇文章:常见 core dump 原因分析signal 11 - SIGSEGV,说signal 11 (SIGSEGV)是由于内存释放不当(多次释放或者空释放)或者空指针引起的,遂检查,终于发现了问题:

在调用NewStringUTF方法的时候使用了ReleaseStringUTFChars进行释放,这个释放内存的方法并不能在此处使用,应该使用DeleteLocalRef来释放引用即可。

jni具体内存释放对应方法如下:

总体原则:释放所有对object的引用

1.FindClass

例如,

jclass ref= (env)->FindClass("java/lang/String");

env->DeleteLocalRef(ref);

2.NewString/ NewStringUTF/NewObject/NewByteArray

例如,

jstring (*NewString)(JNIEnv*, const jchar*, jsize);

const jchar* (*GetStringChars)(JNIEnv*, jstring, jboolean*); void (*ReleaseStringChars)(JNIEnv*, jstring, const jchar*);

jstring (*NewStringUTF)(JNIEnv*, const char*);

const char* (*GetStringUTFChars)(JNIEnv*, jstring, jboolean*); void (*ReleaseStringUTFChars)(JNIEnv*, jstring, const char*);

env->DeleteLocalRef(ref);

3.GetObjectField/GetObjectClass/GetObjectArrayElement

jclass ref = env->GetObjectClass(robj);

env->DeleteLocalRef(ref);

4.GetByteArrayElements和GetStringUTFChars

jbyte* array= (*env)->GetByteArrayElements(env,jarray,&isCopy);

(*env)->ReleaseByteArrayElements(env,jarray,array,0);

const char* input =(*env)->GetStringUTFChars(env,jinput, &isCopy);

(*env)->ReleaseStringUTFChars(env,jinput,input);

5.NewGlobalRef/DeleteGlobalRef

jobject (NewGlobalRef)(JNIEnv, jobject);

void (DeleteGlobalRef)(JNIEnv, jobject);

例如,

jobject ref= env->NewGlobalRef(customObj);

env->DeleteGlobalRef(customObj);

改完果然就没有再闪退了!

signal 11 linux,signal 11 (SIGSEGV)错误排查相关推荐

  1. signal 11 linux,signal 11 定位

    关于关于signal 11段错误,如何快速定位 使用valgrind工具 1.下载最新代码http://valgrind.org/downloads/current.html: 2.解压tar xvf ...

  2. linux signal 11 问题,embedded-在Linux中qemu:uncaught target signal 11(分段错误)

    在刮擦盒内我正在执行git clone,收到以下错误: qemu: uncaught target signal 11 (Segmentation fault) - core dumped 错误: / ...

  3. NDK 编译armebai-v7a的非4字节对齐crash Fatal signal 7 (SIGSEGV) 错误解决

    一直都是编译armabi的.没有不论什么问题,这个架构是软件模拟浮点运算的. 后来看到NDK文档上说armabi-v7a是针对有硬件处理浮点计算的arm cpu的. 于是就改动配置编译armebai- ...

  4. linux中oracle静默安装失败,oracle 11 Linux 静默安装 步骤及错误解决(更新中)

    oracle 11 Linux 静默安装 步骤及错误解决(更新中) oracle 11 Linux 静默安装 步骤及错误解决(更新中) [待更新] oracle成功安装完成后 显示的页面如下 : 此时 ...

  5. linux signal 处理

    linux signal 处理 说明: 本文主要翻译自ULK 3rd chapter 11. 主要受 http://blog.csdn.net/yunsongice 影响,故发表在csdn. 另外,本 ...

  6. Linux Signal及Golang中的信号处理

    转载地址:https://colobu.com/2015/10/09/Linux-Signals/ 信号(Signal)是Linux, 类Unix和其它POSIX兼容的操作系统中用来进程间通讯的一种方 ...

  7. Linux Signal信号详解

    信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用. 信号机制是进程之间相互传递消息的一种方法,信号全 ...

  8. Linux Signal信号表

    [版权申明]转载请附上出处链接 Linux Signal信号表 在终端运行kill -l命令, 可查看Linux支持的信号列表: $kill -l1) SIGHUP 2) SIGINT 3) SIGQ ...

  9. Linux signal 信号列表(sigint,sigtstp..)

    我们运行如下命令,可看到Linux支持的信号列表:$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) ...

最新文章

  1. SharePoint 2007 系列(4) -Site Settings
  2. C++中max,min函数,以及vector字符未定义问题(未声明的标志符)
  3. boost::interprocess::basic_vectorstream用法的测试程序
  4. OpenCV使用Kinect和其他OpenNI兼容的深度传感器
  5. RequireJS 主要函数
  6. 有计算机知识,计算机基本理论基础知识总汇
  7. C语言图形库——EasyX常用函数
  8. 组合数学引论部分习题答案
  9. jmeter开发导入excel脚本
  10. EDA365_skill2.5百度网盘资源
  11. 图像处理--bicubic(双三次插值)
  12. 今天再发一下热门关键字,看看能否推广网站
  13. centos7 AMOEBA读写分离配置
  14. 自古英雄出少年,22岁中国小哥哥入选Nature十大人物
  15. 为什么趁年轻就应该去创业?
  16. 科学网肖波:海外博后申请的一点经验与看法
  17. js实现汉字转拼音(解决首字母排序问题)
  18. php生成统计图类pchart---中文翻译手册
  19. 哪款无线蓝牙耳机性价比高?性价比高的无线蓝牙耳机推荐
  20. 直播 | 2017阿里双11在线技术峰会

热门文章

  1. 前端与移动开发----微信小程序----小程序(四)
  2. 【T+】畅捷通T+存货档案批量修改存货属性
  3. Python中使用BeautifulReport形成测试报告教程
  4. sass基础操作记录
  5. 微信公众平台后台编辑器上线图片缩放和封面图裁剪功能
  6. 主机win7和虚拟机xp之间的文件传输
  7. 域名停靠(域名抢注的几种形式)
  8. 基于JAVA校园快递管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  9. 欧文分校的计算机科学博士,2020年加州大学欧文分校博士含金量
  10. 鸿蒙跨屏协作实现原理,跨屏协作满足效率党 高效工作这几款手机必备