NDK中的常见错误:

Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1)

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad


面对这种native程序异常crash掉,而且还毫无征兆和提示,让人觉得很是崩溃。

在Android程序上调试C代码,是件很痛苦的事情
下面介绍两种调试方法:
一、JNI单步调试

ADTr20及以后已经支持JNI单步调试。

你现在需要做的只需以下2步:

1、使用ndk-build编译时,加上如下参数NDK_DEBUG=1,之后生成so文件之外,还会生成gdbobserver,gdb.setup调式文件

2、在项目的Debug Configuration中选择Android Native Apllication,点击下方Debug。程序会进入C代码中断点处。

此种方法还是很有缺陷性,繁琐不方便,而且效率也不是很高。下面介绍方法二,超级实用,定点错误快


二、借用NDK-STACK调试工具

1.ndk-satck 位于NDK目录下。

运行方法:$SDK_PATH/adb logcat | $NDK_PATH/ndk-stack -sym 你的工程.so文件目录

如。

adb logcat |ndk-stack -sym /Applications/android/workspaceluna/antexmobile/obj/local/armeabi

因为我的sdk和ndk都已经加入到环境变量中,所以没有adb和ndk-stack前面没有加上文件路径

正确配置后会在终端出现

- waiting for device -

2.配置Android.mk

加上如下内容

#对应AndroidManifest.xml中的minSdkVersion。用于debug

APP_PLATFORM := android-14

APP_OPTIM := debug

APP_ABI := armeabi

APP_STL := gnustl_static

NDK_DEBUG = 1

#debug


或者:在AndroidManifest.xml 设置

android:debuggable="true"

在Application选项中(如果报错, 选中当前的问题,右键“quick fix”, 选中 “Disable Check in This File Only”,点击 Finish 即可


3.启动程序,native crash掉后,终端会打印出错误信息


重要的就是 c/cpp行号。为我们定位崩溃地点很有作用,再结合程序的打印输出位置,就能很快定位问题了。



总结:NDK中常见错误,就是指针使用不当。 1.空指针。 2. ( char *) malloc (len + 1)),申请空间大小时,要加1,并且最后一个字节值置为0,表示字符串结尾。动态申请的内存,用完后要及时free掉,避免内存泄露 3. msg = strcat ( msg ,"\r\n") ,使用此方法时,msg的大小要足够大,能够容纳下,自身长度加上追加内容的长度
另一个常见错误就是局部引用与全局引用。 JNI WARNING: 0x40538d98 is not a valid JNI reference 这个错误比较好解决。用NewGlobalRef将其转换成全局引用

// FindClass仅返回局部引用.需将其转换成全局引用

jclass stringClass = (*env)->FindClass(env,"java/lang/String");

strClass=(*env)->NewGlobalRef(env,stringClass);

// NewStringUTF仅返回局部引用.需将其转换成全局引用

jstring coding = (*env)->NewStringUTF(env,"utf-8");

strencoding=(*env)->NewGlobalRef(env,coding);











更多相关文章

  1. android 编译出来的执行文件 not executable: magic 7F45
  2. JNI 引用问题梳理
  3. android避免内存泄露
  4. Android(安卓)JNI开发进阶篇
  5. 错误:Repository test has failed (Android(安卓)studio git配置)
  6. Android(安卓)Studio 上传aar(Library)到JCenter
  7. cocos2d-x 3.0 引用第三方库 及编译成apk时android mk文件写法
  8. Android解决Java.util.concurrent.ExecutionException: com.Andr
  9. 安卓中引用工程

随机推荐

  1. Android经常使用开源组件汇总
  2. 【Android】判断某个AP是否在系统中存在(P
  3. android post请求接口demo
  4. Android(安卓)Audio代码分析23 - attachA
  5. Android文件保存和读取
  6. android的Android(安卓)中Intent和Pendin
  7. 修改 android 手机 hosts 文件的方法
  8. 图片加载库Glide的使用
  9. Android(安卓)system/bin 命令
  10. Android方法过多MutiDex使用说明