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
瞬間倍感親切。
注意
- 在文章中用到的ndk-stack工具,可在android官網上下載 NDK 得到。
- 如果找不到symbols目錄,或在其中沒有找到相應的so庫,可嘗試在Android.mk中的編譯參數中增加-g嘗試一下看是不是能得到帶符號表的so庫。由於我使用的平臺是有symbols目錄的,這一點未經驗證。