Android NDK debug 方法

最近又频繁遇到 NDK 的错误,记录一下调试的一些经验,以备后续查看

一般来说,在 Android Studio中的Monitor中将过滤器的 LOG TAG 设置为 “DEBUG” 就可以将所有的 JNI 的错误显示出来了。如果看不明白报错信息,就要用到下面的工具。

ndk-stack

>Usage:
   ndk-stack -sym <path> [-dump <path>]
      -sym  Contains full path to the root directory for symbols.   
      -dump Contains full path to the file containing the crash dump.  
            This is an optional parameter. If ommited, ndk-stack will read input data from stdin     
   See docs/NDK-STACK.html in your NDK installation tree for more details.

使用方法,adb logcat | ./ndk-stack -sym "xxxx",用 -sym 指定编译生成的 .so 文件的位置,最新版本的 Android studio 的 .so 文件的位置是
project/build/intermediates/cmake/debug/obj/armeabi/xxxxxx.so
其中 armeabi 视条件改变

官方教程说指定目录是 $PROJECT_PATH/obj/local/armeabi 我现在使用最新的 android studio 配合 cmake 开发,已经没有这样的目录了。

可以用 -dump 来分析 tombstone 文件,其位置在 /data/tombstones/ 注意该目录需要 root 权限。

另外,下面链接文中提到的 addr2line 在最新的 ndk 中已经找不到了,估计是被弃用。目前的 ndk 开发文档中只有对 ndk-gdb 和 ndk-stack 的介绍。

NDK Debug 心得

近日又为一个 Native 代码的问题耗费不少时间,经过排查发现确实是我访问了错误的内存。所以以后再遇到 Native 代码导致的 crash 问题时,特别是报错信息让人没有头绪的时候,回头去认真排查自己有没有访问没有开辟的内存地址,我的经验是,访问没有开辟的地址可能还不会崩溃,往往是在释放内存的时候崩溃的。另外就是查看释放的内存有没有问题。

JNI 代码,可能无法做到很好的编译的检查,我们组内遇到过的问题是,Native 函数声明了 int 类型返回值却没有写返回值,程序编译安装正常,在手机上面跑到那个函数了才会挂掉。

参考链接
Android NDK Tombstone/Crash 分析

posted @ 2016-11-30 15:20  皮斯卡略夫  阅读(1480)  评论(0编辑  收藏  举报