利用NDK崩潰日誌查找BUG

06-20 15:54:35.331 23889 23889 I DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
06-20 15:54:35.331 23889 23889 I DEBUG   : Build fingerprint: 'google/razorg/deb:4.4.2/KOT49H/937116:user/release-keys'
06-20 15:54:35.331 23889 23889 I DEBUG   : Revision: '0'
06-20 15:54:35.331 23889 23889 I DEBUG   : pid: 1981, tid: 2020, name: Thread-3399  >>> com.guangyou.ddgame <<<
06-20 15:54:35.331 23889 23889 I DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000028
06-20 15:54:35.431   187   710 D audio_hw_primary: out_set_parameters: enter: usecase(0: deep-buffer-playback) kvpairs: routing=2
06-20 15:54:35.511 23889 23889 I DEBUG   :     r0 76d94458  r1 00000000  r2 00000000  r3 00000000
06-20 15:54:35.511 23889 23889 I DEBUG   :     r4 760c1a48  r5 751e2440  r6 00000001  r7 760c1a48
06-20 15:54:35.511 23889 23889 I DEBUG   :     r8 00000001  r9 76c96f3c  sl 76c861c0  fp 76d94444
06-20 15:54:35.511 23889 23889 I DEBUG   :     ip 00000001  sp 76d94430  lr 75a81bd8  pc 75a81bdc  cpsr 600f0010
06-20 15:54:35.511 23889 23889 I DEBUG   :     d0  746968775f327865  d1  6a6e6169642f675f
06-20 15:54:35.511 23889 23889 I DEBUG   :     d2  5f6f616978757169  d3  676e702e6e776f6d
06-20 15:54:35.511 23889 23889 I DEBUG   :     d4  0000000009000000  d5  0000000000000000
06-20 15:54:35.511 23889 23889 I DEBUG   :     d6  0000000000000000  d7  0000000000000000

怎樣獲取android的系統日誌android

假設你已經安裝了 Android Develop Tools, 能夠成功調用adb. 並打開android開發用機的調試模式, 鏈接到電腦.c++

打開命令行, 在命令行輸入: adb logcat. 就能夠看到滿屏幕的日誌啦. 輸入adb logcat --help能夠看到 logcat的用法提示.工具

這裏有兩個參數特別提醒一下, 比較經常使用:ui

  1. -v XXXX: 用來選擇log輸出樣式, 通常建議 threadtime, 更加詳細.
  2. -d: 讓log一次性輸出後立刻完畢. 若是沒有此命令, logcat 工具會一直輸出, 即便更新在界面上.

若是須要保存log到文件, 方便之後查看. 可輸入命令: adb logcat -v threadtime -d > log.txtgoogle

  1. ndk crash log以*** *** *** *** ***開始.
  2. 第一行Build fingerprint: 'google/razorg/deb:4.4.2/KOT49H/937116:user/release-keys' 指明瞭運行的Android版本, 若是您有多份crash dump的話這個信息就比較有用了.
  3. 接着一行顯示的是當前的線程id(pid)和進程id(tid). 若是當前崩潰的線程是主線程的話, pid和tid會是同樣的~
  4. 第四行, 顯示的是unix信號. 這裏的signal 11, 即SIGSEGV, 表示段錯誤, 是最多見的信號.(什麼是unix信號, 什麼是SIGSEGV)
  5. 接下來的部分是系統寄存器的dump信息.

利用ndk-stack定位崩潰代碼命令行

上面的一些信息能簡單的幫你定位如下問題. 若是信息量還不夠大的話, 那就還有最後一招: 還原歷史.線程

Android NDK自從版本R6開始, 提供了一個工具ndk-stack( 在目錄{ndk_root}/中 ). 這個工具能自動分析dump下來的crash log, 將崩潰時的調用內存地址和c++代碼一行一行對應起來.unix

咱們先看一下用法, 執行命令ndk-stack --help調試

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
-dump參數很容易理解, 即dump下來的log文本文件. ndk-stack會分析此文件.
-sym參數就是你android項目下,編譯成功以後,obj目錄下的文件.

adb logcat | ndk-stack -sym ./obj/local/armeabi日誌

相關文章
相關標籤/搜索