NDK DEBUG方法

    xiaoxiao2021-03-25  127

    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);

    转载地址:

    http://www.tuicool.com/articles/Vrq26j

    转载请注明原文地址: https://ju.6miu.com/read-7285.html

    最新回复(0)