前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Android 利用addr2line 定位 native crash问题

Android 利用addr2line 定位 native crash问题

作者头像
小驰行动派
发布2025-02-18 22:45:23
发布2025-02-18 22:45:23
10200
代码可运行
举报
文章被收录于专栏:Android Camera开发Android Camera开发
运行总次数:0
代码可运行

addr2line bin文件,是在prebuilts目录下 ,如下所示,通过find -name aarch64-linux-android-addr2line 命令,能找的到64位bin文件所在的文件目录。

代码语言:javascript
代码运行次数:0
复制
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日志里面的异常堆栈信息,我们需要根据这些信息来定位具体代码的调用位置,进而来排查问题出现的原因。

代码语言:javascript
代码运行次数:0
复制
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文件。

代码语言:javascript
代码运行次数:0
复制
/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命令。

代码语言:javascript
代码运行次数:0
复制
$ addr2line -C -f -e out/target/product/XXX/symbols/vendor/lib64/libcamxncs.so 000000000000e760
CamX::NCSService::StopNCSService()
vendor/qcom/proprietary/camx/src/core/ncs/camxncsservice.cpp:369

那我们就可以看到,对应调用的代码是在vendor/qcom/proprietary/camx/src/core/ncs/camxncsservice.cpp下,369行。然后调用的函数是

StopNCSService(),这个调用的函数也是和异常堆栈是一致的。

其它的堆栈地址调用代码确认,也是按照这个方法来即可。

【注意】在本地用addr2line命令定位代码时,要确保本地的代码和出问题的机器烧录版本的代码内容是一致的,这样定位才是准确的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小驰行动派 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档