首页 > 代码库 > NDK DEBUG方法
NDK DEBUG方法
NDK中的常见错误:
Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1)
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
面对这种native程序异常crash掉,而且还毫无征兆和提示,让人觉得很是崩溃。
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行号。为我们定位崩溃地点很有作用,再结合程序的打印输出位置,就能很快定位问题了。
// 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);
NDK DEBUG方法