Android程式backtrace分析方法
如何分析Android程式的backtrace
最近碰到Android apk crash的問題,單從log很難定位。從tombstone裡面得到下面的backtrace。
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***Build fingerprint: 'Android/msm8996/msm8996:7.1.2/N2G47H/20180921.193127:userdebug/test-keys'Revision: '0'ABI: 'arm64'pid: 2848, tid: 3158, name: Thread-5819 >>> com.company.package <<<
backtrace: #00 pc 00000000000a96c8 /system/app/Package/Package.apk (offset 0x5c1000) #01 pc 00000000000b4574 /system/app/Package/Package.apk (offset 0x5c1000) #02 pc 00000000000d52f0 /system/app/Package/Package.apk (offset 0x5c1000) #03 pc 00000000000367ac /system/app/Package/Package.apk (offset 0xe0e000) #04 pc 0000000000033070 /system/app/Package/Package.apk (offset 0xe0e000) #05 pc 0000000000176910 /system/app/Package/Package.apk (offset 0xe0e000) #06 pc 0000000000068618 /system/lib64/libc.so (_ZL15__pthread_startPv+196) #07 pc 000000000001df68 /system/lib64/libc.so (__start_thread+16)
一看這個backtrace有點傻眼。通常得到的backtrace應該會打印出呼叫的so還有相應的函式名,這個不知道怎麼回事只顯示出apk的名字。調查了半天,懷疑是隻有在apk是install的時候,才會有符號表的資訊,出現有資訊的列印。我們這個出現問題的時候,apk是編到rom裡的,so庫的符號表應該都被stip掉了。但是問題是這個crash很難重現,安裝apk以後一直復現不了。好在這個apk自己只有三個so庫,用addr2line試一試應該容易試出來。Android的sdk裡自帶了addr2line的工具,我們用的ndk13b版本,在windows上這個工具所在的目錄是\Android\Sdk\android-ndk-r13b\toolchains\x86_64-4.9\prebuilt\windows-x86_64\bin,用-e引數指定檔名,-f引數顯示函式名。果然,很容易就試出來是哪個so了。
$ ./x86_64-linux-android-addr2line.exe -e ~/StudioProjects/Service/package/app/build/intermediates/cmake/debug/obj/arm64-v8a/libndk_camera.so -f 176910execute_native_thread_routine/usr/local/google/buildbot/src/android/ndk-r13-release/toolchain/gcc/gcc-4.9/libstdc++-v3/src/c++11/thread.cc:84
$ ./x86_64-linux-android-addr2line.exe -e ~/StudioProjects/RobotVisionService/package/app/build/intermediates/cmake/debug/obj/arm64-v8a/libndk_camera.so -f 33070_ZNKSt7_Mem_fnIM12CameraEngineFvvEEclIJEvEEvPS0_DpOT_C:/Users/qwang/AppData/Local/Android/Sdk/android-ndk-r13b/sources/cxx-stl/gnu-libstdc++/4.9/include/functional:569 (discriminator 4)
$ ./x86_64-linux-android-addr2line.exe -e ~/StudioProjects/RobotVisionService/package/app/build/intermediates/cmake/debug/obj/arm64-v8a/libndk_camera.so -f 367ac_ZN12CameraEngine12ProcessFrameEvC:\Users\qwang\StudioProjects\RobotVisionService\package\app\src\main\cpp/camera_engine.cpp:525 (discriminator 2)
$ ./x86_64-linux-android-addr2line.exe -e ~/StudioProjects/RobotVisionService/package/app/build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so -f d52f0_ZN9OrionAlgo38vision_Algo_regressFacekeypointFromMatEN2cv3MatEiiiiC:\Users\qwang\StudioProjects\RobotVisionService\package\app\src\main\cpp/OrionAlgo.cpp:107
$ ./x86_64-linux-android-addr2line.exe -e ~/StudioProjects/RobotVisionService/package/app/build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so -f b4574_ZN6vision13TrackStrategy13trackOrDetectERN2cv3MatEPNS_3SSDERSt6vectorI3BoxSaIS7_EEfC:\Users\qwang\StudioProjects\RobotVisionService\package\app\src\main\cpp\src\main\cpp\inference\postproc\src/track_strategy.cpp:38
$ ./x86_64-linux-android-addr2line.exe -e ~/StudioProjects/RobotVisionService/package/app/build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so -f a96c8_ZN6vision3SSD6detectERN2cv3MatERSt6vectorI3BoxSaIS5_EEC:\Users\qwang\StudioProjects\RobotVisionService\package\app\src\main\cpp\src\main\cpp\inference\algo\src/ssd.cpp:82