Android NDK debug 方法

本文分享了作者在解决Android NDK错误过程中的调试经验,包括如何使用AndroidStudio的Monitor过滤器和ndk-stack工具来定位JNI错误,以及分析tombstone文件的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近又频繁遇到 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 分析

转载于:https://www.cnblogs.com/psklf/p/6179436.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值