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目录的,这一点未经验证。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章