[Mac] Android 如何分析 Native Crash
0、系统环境
Mac OSX 10.11.6
Eclipse for Android 4.6.0
Android SDK v21
Android NDK r12d
1、环境安装
本文默认您已经安装了 Android SDK 和 NDK 开发包,其中安装目录分别为 ANDROID_SDK_PATH 与 ANDROID_NDK_PATH。
1)安装 ADB 工具(如已安装请跳到下一步):
检查你是否安装了 ADB 工具。打开 Window -> Android SDK Manager 安装 Android SDK Tools 和 Android Platform Tools:
2)配置 ADB 工具:
在命令行运行:
1 | echo 'export PATH=$PATH:ANDROID_SDK_PATH/platform-tools/' >> ~/.bash_profile |
注意其中 ANDROID_SDK_PATH 是你实际安装 Android SDK 的位置。
在命令行运行如下命令测试安装:
1 | adb devices |
如果显示类似如下:
1 2 | List of devices attached 04157df41c14bf29 device |
则说明配置正确。
3)配置 ndk-stack 工具:
在命令行运行:
1 | echo 'export PATH=$PATH:ANDROID_NDK_PATH/' >> ~/.bash_profile |
注意其中 ANDROID_NDK_PATH 是你实际安装 Android NDK 的位置。
2、操作步骤
1)当遇到崩溃时使用 ADB 工具保存崩溃日志:
1 | adb logcat > ANDROID_CRASHLOG_PATH/logs.txt |
其中 ANDROID_CRASHLOG_PATH 是你打算保存 Crash Log 的路径。
2)运行 ndk-stack 工具进行分析:
1 | ndk-stack -sym ANDROID_PROJECT_PATH/libs/armeabi-v7a/ -dump ANDROID_CRASHLOG_PATH/log.txt |
其中 ANDROID_PROJECT_PATH 是你的 Android 工程目录,通常 ANDROID_PROJECT_PATH/libs/armeabi-v7a/ 或者 armabi 等路径保存了你的 native 库。第一个参数就是需要这个地址。
另外,有时候可能由于没有保存符号表等原因,这里定位不出来,则应该改成你编译你的 native 库的工程下 obj/local/armeabi-v7a 这类的路径。
如果一切运行正常,找到崩溃日志如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ********** Crash dump: ********** Build fingerprint: 'samsung/zeroltezc/zeroltechn:6.0.1/MMB29K/G9250ZCS2DPH2:user/release-keys' pid: 31387, tid: 31428, name: Binder_3 >>> com.tencent.qarsdk <<< signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x626f2075 Stack frame #00 pc 001d08b4 /system/lib/libart.so (_ZN3art2gc5space19LargeObjectMapSpace5AllocEPNS_6ThreadEjPjS5_S5_+151) Stack frame #01 pc 0012bdb7 /system/lib/libart.so (_ZN3art2gc4Heap16AllocLargeObjectILb1ENS_6mirror16SetLengthVisitorEEEPNS3_6ObjectEPNS_6ThreadEPPNS3_5ClassEjRKT0_+130) Stack frame #02 pc 002a2d3b /system/lib/libart.so (_ZN3art6mirror14PrimitiveArrayIaE5AllocEPNS_6ThreadEj+498) Stack frame #03 pc 002a39fb /system/lib/libart.so (_ZN3art3JNI12NewByteArrayEP7_JNIEnvi+322) Stack frame #04 pc 0010c6cb /system/lib/libart.so (_ZN3art8CheckJNI17NewPrimitiveArrayEPKcP7_JNIEnviNS_9Primitive4TypeE+586) Stack frame #05 pc 000a64c7 /system/lib/libandroid_runtime.so (_ZN16JNICameraContext11copyAndPostEP7_JNIEnvRKN7android2spINS2_7IMemoryEEEi+138) Stack frame #06 pc 000a68f3 /system/lib/libandroid_runtime.so (_ZN16JNICameraContext8postDataEiRKN7android2spINS0_7IMemoryEEEP21camera_frame_metadata+102) Stack frame #07 pc 00021f5d /system/lib/libcamera_client.so (_ZN7android6Camera12dataCallbackEiRKNS_2spINS_7IMemoryEEEP21camera_frame_metadata+58) Stack frame #08 pc 00026d79 /system/lib/libcamera_client.so (_ZN7android14BnCameraClient10onTransactEjRKNS_6ParcelEPS1_j+190) Stack frame #09 pc 000199c9 /system/lib/libbinder.so (_ZN7android7BBinder8transactEjRKNS_6ParcelEPS1_j+60) Stack frame #10 pc 0001ed5d /system/lib/libbinder.so (_ZN7android14IPCThreadState14executeCommandEi+552) Stack frame #11 pc 0001eee9 /system/lib/libbinder.so (_ZN7android14IPCThreadState20getAndExecuteCommandEv+64) Stack frame #12 pc 0001ef4d /system/lib/libbinder.so (_ZN7android14IPCThreadState14joinThreadPoolEb+48) Stack frame #13 pc 000239fd /system/lib/libbinder.so Stack frame #14 pc 000101fd /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv+112) Stack frame #15 pc 00062d93 /system/lib/libandroid_runtime.so (_ZN7android14AndroidRuntime15javaThreadShellEPv+70) Stack frame #16 pc 0003fc63 /system/lib/libc.so (_ZL15__pthread_startPv+30) Stack frame #17 pc 0001a39b /system/lib/libc.so (__start_thread+6) |
接下来就根据这个日志来分析你崩溃的原因吧!
常见问题:
1)找不到 Android SDK Manager:
解决方法:Window -> Perspective -> Open Perspective 选 Java,然后就可以找到了。