使用android studio进行ndk开发时如何定位crash错误

来源:互联网 发布:要启用windows aero 编辑:程序博客网 时间:2024/06/03 22:59

使用android studio进行ndk开发时如何定位crash崩溃错误
这里写图片描述

在ndk开发时, jni层的代码一旦出现问题, 就会打印如下信息, 然后直接闪退, 这时候让人非常抓狂, 只能过在各个jni函数中打印日志来跟踪问题,但是效率实在是太低,碰到有多线程的时候很难定位到问题.

网上搜索到的定位ndk崩溃的文章都是使用eclipse来举例的, 编译时产生的so文件保存在obj/local/armeabi/目录下, 但是使用android studio进行开发的话根本没有obj/local/armeabi/这个目录.

因此本篇文章就来介绍下如何在android studio下来定位ndk崩溃

  1. 首先我们要先把Logcat里的show only selected application选项改成No Filters(红框1), 这时就能看到系统打印出的DEBUG信息.
  2. 在DEBUG信息里找到backtrace(红框2), 这段就是系统给出的造成崩溃的信息, 但仅仅给出了是哪个函数, 而没有准确给出是那一行代码造成的崩溃.
  3. 记下#00 pc 00013122(红框3)这个信息, 这个信息就是用来定位崩溃代码的地址

这里写图片描述

想要准确定位崩溃代码的地址的话我们就需要用到ndk工具包里的adrr2line这个工具了

  1. 首先先找到这个工具, linux系统这个工具在如下位置
/home/gavinandre/Documents/Android/android-sdk-linux/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-addr2line

在该目录下做个软链接后就能在任何目录使用这个命令了

sudo ln -s arm-linux-androideabi-addr2line /usr/local/bin/addr2line
  1. 找到造成崩溃的so文件地址, 在app目录下搜索so文件
$ find -name "libsocket_camera-lib.so"./build/intermediates/bundles/debug/jni/armeabi-v7a/libsocket_camera-lib.so./build/intermediates/bundles/default/jni/armeabi-v7a/libsocket_camera-lib.so./build/intermediates/cmake/release/obj/armeabi-v7a/libsocket_camera-lib.so./build/intermediates/cmake/debug/obj/armeabi-v7a/libsocket_camera-lib.so./build/intermediates/transforms/mergeJniLibs/release/folders/2000/3/main/lib/armeabi-v7a/libsocket_camera-lib.so./build/intermediates/transforms/mergeJniLibs/debug/folders/2000/3/main/lib/armeabi-v7a/libsocket_camera-lib.so./build/intermediates/transforms/stripDebugSymbol/release/folders/2000/3/main/lib/armeabi-v7a/libsocket_camera-lib.so./build/intermediates/transforms/stripDebugSymbol/debug/folders/2000/3/main/lib/armeabi-v7a/libsocket_camera-lib.so

可以看到android studio编译后生成了许多so文件, 以我的经验正确的so文件一般是这个文件:build/intermediates/transforms/mergeJniLibs/release/folders/2000/3/main/lib/armeabi-v7a/libsocket_camera-lib.so

然后就可以使用addrline命令了, 格式是addr2line -e 文件位置 崩溃地址(红框3: 00013122)

addr2line -e build/intermediates/transforms/mergeJniLibs/release/folders/2000/3/main/lib/armeabi-v7a/libsocket_camera-lib.so 00013122

如果so文件正确的话会打印如下信息,socket_camera.cpp就是崩溃的cpp文件, 304就是行数, 然后检查下定位出来的位置是否在DEBUG信息里给出的函数里(红框4)

/home/gavinandre/Documents/Workspace/AndroidStudioProject/DisinfectionRobot/nvadtslibrary/src/main/cpp/nvadts/video_engine.cpp:304

如果so文件错误的话会打印问号或者一个不对的位置, 这时就要换so文件多尝试了

??:?