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