Android 利用addr2line 定位 native crash问题
addr2line bin文件,是在prebuilts目录下 ,如下所示,通过find -name aarch64-linux-android-addr2line 命令,能找的到64位bin文件所在的文件目录。
prebuilts$ find -name aarch64-linux-android-addr2line./gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-addr2line
在源码里面,在任意的位置,我们都能直接调用到addr2line 命令来使用。
使用命令如下:
addr2line -C -f -e out/target/product/XXX/symbols/***.so 0000000000025494(堆栈地址)
注意so文件,得是symbols目录下的。
下面来看个实际的例子。
下面是logcat日志里面的异常堆栈信息,我们需要根据这些信息来定位具体代码的调用位置,进而来排查问题出现的原因。
1047 5334 5334 F DEBUG : #02 pc 000000000000e760 /vendor/lib64/libcamxncs.so (CamX::NCSService::StopNCSService()+240) (BuildId: 833401d49b1488e2db728189653417db)1047 5334 5334 F DEBUG : #03 pc 000000000000e564 /vendor/lib64/libcamxncs.so (CamX::NCSService::UnregisterService(CamX::NCSSensor*)+548) (BuildId: 833401d49b1488e2db728189653417db)
我们来看下这个是调用到了哪个具体代码。
1047 5334 5334 F DEBUG : #02 pc 000000000000e760 /vendor/lib64/libcamxncs.so (CamX::NCSService::StopNCSService()+240) (BuildId: 833401d49b1488e2db728189653417db)
首先在源码out目录下,搜索libcamxncs.so文件,找到libcamxncs.so 的symbols文件。
/out/target$ find -name libcamxncs.so./product/xxx/obj_arm/SHARED_LIBRARIES/libcamxncs_intermediates/libcamxncs.so./product/xxx/obj_arm/SHARED_LIBRARIES/libcamxncs_intermediates/LINKED/libcamxncs.so./product/xxx/symbols/vendor/lib64/libcamxncs.so./product/xxx/symbols/vendor/lib/libcamxncs.so
接下来,就可以采用addr2line命令。
$ addr2line -C -f -e out/target/product/XXX/symbols/vendor/lib64/libcamxncs.so 000000000000e760CamX::NCSService::StopNCSService()vendor/qcom/proprietary/camx/src/core/ncs/camxncsservice.cpp:369
那我们就可以看到,对应调用的代码是在vendor/qcom/proprietary/camx/src/core/ncs/camxncsservice.cpp下,369行。然后调用的函数是
StopNCSService(),这个调用的函数也是和异常堆栈是一致的。
其它的堆栈地址调用代码确认,也是按照这个方法来即可。
【注意】在本地用addr2line命令定位代码时,要确保本地的代码和出问题的机器烧录版本的代码内容是一致的,这样定位才是准确的。
《小驰行动派的知识星球》
————————————————
推荐阅读:
关于博主
Camera基础及一些基本概念
Android Camera 学习路线 | 个人推荐
Android Camera开发系列(干货满满)
Camera Hal|如何学习一个新平台
一篇文章带你了解Android 最新Camera框架
学习完Camera入门课程视频,可以去找工作了?