Table of Contents

Android 上的崩潰分析

關於 原生(Android) 和 Unity(Android)上的崩潰,可參考如下說明。

開發中的崩潰位置獲取

在 Android Studio 中調試 Android 的 Native 程序時,需要在 Configuration 設置中將 Debugger - Debug type 改爲Dual (Java + Native)。

crash Android configuratio

在 Android Studio 中調試時需要的信息如下圖。

crash Android stack

在 lldb 中輸入 bt ,可以獲得崩潰原因和代碼運行棧,如下

(lldb) bt
* thread #16, name = 'samples.helloar', stop reason = signal SIGSEGV: invalid address (fault address: 0x9c40)
* frame #0: 0x0000004922f3a1d8 libEasyAR.so`___lldb_unnamed_symbol3056$$libEasyAR.so + 6088
    frame #1: 0x0000004922f38568 libEasyAR.so`___lldb_unnamed_symbol3054$$libEasyAR.so + 288
    frame #2: 0x0000004922f347f8 libEasyAR.so`___lldb_unnamed_symbol2876$$libEasyAR.so + 332
    frame #3: 0x00000049be2390c8 libc.so`__pthread_start(void*) + 40
    frame #4: 0x00000049be1f04f8 libc.so`__start_thread + 72

當代碼運行棧中存在 libEasyAR.so 相關的內容時,可能說明崩潰和 EasyAR 有關;如果不存在,則有較大概率崩潰和 EasyAR 無關。

在 lldb 中輸入 image dump sections libEasyAR.so,可以獲得動態庫 .text 節加載地址,如下

(lldb) image dump sections libEasyAR.so
...
  SectID     Type             Load Address                             Perm File Off.  File Size  Flags      Section Name
...
  0x00000010 code             [0x0000004922e30cfc-0x0000004923654558)  r-x  0x00256cfc 0x0082385c 0x00000006 libEasyAR.so..text
...

發佈後的崩潰位置獲取

發佈後,也有可能遇到崩潰的情況。

如果出現可以重現的崩潰,可以嘗試使用 Android Studio 自帶的 Profile/Debug 工具。然後按照開發中的做法即可獲得崩潰位置。

crash Android debug

如果出現難以重現的崩潰,可以使用一些 crash 報告庫,攔截應用崩潰信息,並報告到服務器。但是需要注意,崩潰信息中一定要包含代碼運行棧和模塊加載地址兩部分信息。由於 Android 從 4.0 開始引入 ASLR(地址空間佈局隨機化),動態庫模塊加載地址在每次運行時都可能不同,會導致代碼地址也會動態變化,只有知道代碼棧中的代碼地址和動態庫模塊加載地址的相對值,才能知道程序在什麼位置發生了崩潰。

當代碼運行棧中存在 libEasyAR.so 相關的內容時,可能說明崩潰和 EasyAR 有關;如果不存在,則有較大概率崩潰和 EasyAR 無關。

其他崩潰相關信息

  • EasyAR Sense 和 EasyAR Sense Unity Plugin 的版本號

    如 4.7.0.11800-cf8e24e30

  • 社區版/企業版

  • CPU 架構

    aarch64/armeabi-v7a