2> Android 源碼開發C/C++ Crash錯誤定位

Android 源碼開發C/C++ Crash錯誤定位

在進行Android源碼開發的時候,出現C/C++報錯的時候,一堆的Crash信息,可是都是看不懂的符號,經過一番搜查後,發現了一些NDK開發過程中定位錯誤的方法。我就是借鑑了Android NDK開發Crash錯誤定位 文章中的方法,然後總結出在Android源碼中,分析方法。可能在源碼中還有更好用的,或者說是類似 ndk-stack 工具,歡迎在評論區中告知,相互學習,謝謝。

依樣畫葫蘆

捉出報錯時logcat信息。

$ adb logcat -v time > log.txt

#最終只需要crash信息,如:

    --------- beginning of crash
2020-04-14 14:41:41.260 1943-15198/? A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0xb05fbf80 in tid 15198 (Binder:1943_1)
2020-04-14 14:41:41.326 28008-28008/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2020-04-14 14:41:41.327 28008-28008/? A/DEBUG: Build fingerprint: 'Allwinner/t7_p1/t7-p1:7.1.1/NMF27D/20200411:eng/test-keys'
2020-04-14 14:41:41.327 28008-28008/? A/DEBUG: Revision: '0'
2020-04-14 14:41:41.327 28008-28008/? A/DEBUG: ABI: 'arm'
2020-04-14 14:41:41.327 28008-28008/? A/DEBUG: pid: 1943, tid: 15198, name: Binder:1943_1  >>> /system/bin/awcameraservice <<<
2020-04-14 14:41:41.327 28008-28008/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xb05fbf80
2020-04-14 14:41:41.327 28008-28008/? A/DEBUG:     r0 a8a06e00  r1 b05fbf80  r2 00000280  r3 a6958768
2020-04-14 14:41:41.327 28008-28008/? A/DEBUG:     r4 b40d6610  r5 00000280  r6 b05fbf80  r7 00000003
2020-04-14 14:41:41.328 28008-28008/? A/DEBUG:     r8 00000280  r9 00000002  sl b05fc000  fp 00000280
2020-04-14 14:41:41.328 28008-28008/? A/DEBUG:     ip 0000000a  sp a5ed67b8  lr b61556a9  pc b61ba660  cpsr 600d0030
2020-04-14 14:41:41.349 28008-28008/? A/DEBUG: backtrace:
2020-04-14 14:41:41.349 28008-28008/? A/DEBUG:     #00 pc 00017660  /system/lib/libc.so (memcpy+257)
2020-04-14 14:41:41.349 28008-28008/? A/DEBUG:     #01 pc 000056a5  /system/lib/librtsupload.so (_ZN7android18RTSAVClientManager13fillFrameDataEPNS_11RTSAVClientEPNS_10_FrameDataEPKhj+188)
2020-04-14 14:41:41.349 28008-28008/? A/DEBUG:     #02 pc 00005f43  /system/lib/librtsupload.so (_ZN7android18RTSAVClientManager15sendAVFrameDataEiiiPKhj+150)
2020-04-14 14:41:41.349 28008-28008/? A/DEBUG:     #03 pc 0000629b  /system/lib/librtsupload.so (_ZN7android18RTSAVClientManager11sendAVFrameEiRKNS_2spINS_7IMemoryEEEP21_camera_data_metadata+574)
2020-04-14 14:41:41.350 28008-28008/? A/DEBUG:     #04 pc 0001da05  /system/lib/libawcamera.so (_ZN7android23CameraHardwareInterface19__data_cb_timestampExiPKNS_15awcamera_memoryEjP21_camera_data_metadataPv+88)
2020-04-14 14:41:41.350 28008-28008/? A/DEBUG:     #05 pc 00014939  /system/lib/libawcamera.so (_ZN7android16CallbackNotifier17timestampCallbackEPvixP21_camera_data_metadata+124)
2020-04-14 14:41:41.350 28008-28008/? A/DEBUG:     #06 pc 000144d3  /system/lib/libawcamera.so
2020-04-14 14:41:41.350 28008-28008/? A/DEBUG:     #07 pc 0000658b  /system/lib/libAWRecorder.so
2020-04-14 14:41:41.350 28008-28008/? A/DEBUG:     #08 pc 00046f63  /system/lib/libc.so (_ZL15__pthread_startPv+22)
2020-04-14 14:41:41.350 28008-28008/? A/DEBUG:     #09 pc 00019cfd  /system/lib/libc.so (__start_thread+6)
2020-04-14 14:41:42.635 28008-28008/? E/DEBUG: cannot get registers: No such process
2020-04-14 14:41:42.635 28008-28008/? W/libbacktrace: virtual bool UnwindPtrace::Unwind(size_t, ucontext_t *): unw_init_remote failed -3

然後,按參考博文中的ndk-stack 工具轉換方法進行換:

$ ndk-stack -sym xxx/android/out/target/product/t7-p1/system/lib -dump log.txt

結果,出乎了我的意料,竟然失敗了。還是一樣的,沒有行號。

再學習才能成功

經過搜索在一文章中看到,不同so庫的差別,ndk-stack中的參數 -sym是要帶有符號表的so庫的,明顯在android編譯結果 android/out/target/product/t7-p1/system/lib 目錄下的so庫是不帶符號表的。經過搜索:

$ find ./ -name librts*.so
./target/product/t7-p1/symbols/system/lib/librtsupload.so
./target/product/t7-p1/system/lib/librtsupload.so
./target/product/t7-p1/obj/lib/librtsupload.so
./target/product/t7-p1/obj/PACKAGING/target_files_intermediates/t7_p1-target_files-20200423/SYSTEM/lib/librtsupload.so
./target/product/t7-p1/obj/PACKAGING/target_files_intermediates/t7_p1-target_files-20200422/SYSTEM/lib/librtsupload.so
./target/product/t7-p1/obj/PACKAGING/target_files_intermediates/t7_p1-target_files-20200427/SYSTEM/lib/librtsupload.so
./target/product/t7-p1/obj/PACKAGING/target_files_intermediates/t7_p1-target_files-20200425/SYSTEM/lib/librtsupload.so
./target/product/t7-p1/obj/PACKAGING/target_files_intermediates/t7_p1-target_files-20200420/SYSTEM/lib/librtsupload.so
./target/product/t7-p1/obj/SHARED_LIBRARIES/librtsupload_intermediates/LINKED/librtsupload.so
./target/product/t7-p1/obj/SHARED_LIBRARIES/librtsupload_intermediates/PACKED/librtsupload.so

我想 target/product/t7-p1/symbols/system/lib/librtsupload.so 應該就是我們要的so庫,重新改變-sym 參數後:

$ ndk-stack -sym xxx/android/out/target/product/t7-p1/symbols/system/lib -dump log.txt

#結果
********** Crash dump: **********
Build fingerprint: 'Allwinner/t7_p1/t7-p1:7.1.1/NMF27D/20200411:eng/test-keys'
#00 0x00017660 /system/lib/libc.so (memcpy+257)
                                    memcpy
                                    ??:0:0
#01 0x000056a5 /system/lib/librtsupload.so (_ZN7android18RTSAVClientManager13fillFrameDataEPNS_11RTSAVClientEPNS_10_FrameDataEPKhj+188)
                                            android::RTSAVClientManager::RTSAVClientManager()
                                            /proc/self/cwd/vendor/aw/public/auto/awcamera/lib/libcameraserver/rtsupload/RTSAVClientManager.cpp:46:9
#02 0x00005f43 /system/lib/librtsupload.so (_ZN7android18RTSAVClientManager15sendAVFrameDataEiiiPKhj+150)
                                            android::RTSAVClientManager::prepareRTSAVClient(android::ServerType, char const*, char const*, int, int, android::DataType, android::StreamType, void (*)(int, int, unsigned char const*, void*), void*)
                                            /proc/self/cwd/vendor/aw/public/auto/awcamera/lib/libcameraserver/rtsupload/RTSAVClientManager.cpp:548:13
#03 0x0000629b /system/lib/librtsupload.so (_ZN7android18RTSAVClientManager11sendAVFrameEiRKNS_2spINS_7IMemoryEEEP21_camera_data_metadata+574)
                                            android::RTSAVClientManager::sendPlaybackAVFrame(int, int, void*)
                                            /proc/self/cwd/vendor/aw/public/auto/awcamera/lib/libcameraserver/rtsupload/RTSAVClientManager.cpp:741:9
#04 0x0001da05 /system/lib/libawcamera.so (_ZN7android23CameraHardwareInterface19__data_cb_timestampExiPKNS_15awcamera_memoryEjP21_camera_data_metadataPv+88)
                                           android::CameraHardwareInterface::__data_cb_timestamp(long long, int, android::awcamera_memory const*, unsigned int, _camera_data_metadata*, void*)
                                           ??:0:0
#05 0x00014939 /system/lib/libawcamera.so (_ZN7android16CallbackNotifier17timestampCallbackEPvixP21_camera_data_metadata+124)
                                           android::CallbackNotifier::timestampCallback(void*, int, long long, _camera_data_metadata*)
                                           ??:0:0
#06 0x000144d3 /system/lib/libawcamera.so
??
??:0:0
#07 0x0000658b /system/lib/libAWRecorder.so
??
??:0:0
#08 0x00046f63 /system/lib/libc.so (_ZL15__pthread_startPv+22)
                                    __pthread_start(void*)
                                    /proc/self/cwd/bionic/libc/bionic/pthread_create.cpp:198:18
#09 0x00019cfd /system/lib/libc.so (__start_thread+6)
                                    __start_thread
                                    /proc/self/cwd/bionic/libc/bionic/clone.cpp:41:16
Crash dump is completed

看到這一行:

android::RTSAVClientManager::sendPlaybackAVFrame(int, int, void*)
                                            /proc/self/cwd/vendor/aw/public/auto/awcamera/lib/libcameraserver/rtsupload/RTSAVClientManager.cpp:741:9

瞬間倍感親切。

注意

  1. 在文章中用到的ndk-stack工具,可在android官網上下載 NDK 得到。
  2. 如果找不到symbols目錄,或在其中沒有找到相應的so庫,可嘗試在Android.mk中的編譯參數中增加-g嘗試一下看是不是能得到帶符號表的so庫。由於我使用的平臺是有symbols目錄的,這一點未經驗證。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章