正确姿势使用arm-linux-androideabi-addr2line

前言

   arm-linux-androideabi-addr2line是NDK中提供的将内存地址转换成行号的一个工具,通俗具体点就是根据各种日志,譬如trace日志和tomestone日志中包含的so库日志的中偏移内存地址,定位到具体是在那个文件的那一行。下面跟着我,一起学正确使用姿势。


一.命令使用方法

xxx$ arm-linux-androideabi-addr2line  --h
Usage: arm-linux-androideabi-addr2line [option(s)] [addr(s)]Convert addresses into line number/file name pairs.If no addresses are specified on the command line, they will be read from stdinThe options are:@<file>                Read options from <file>-a --addresses         Show addresses-b --target=<bfdname>  Set the binary file format-e --exe=<executable>  Set the input file name (default is a.out)-i --inlines           Unwind inlined functions-j --section=<name>    Read section-relative offsets instead of addresses-p --pretty-print      Make the output easier to read for humans-s --basenames         Strip directory names-f --functions         Show function names-C --demangle[=style]  Demangle function names-h --help              Display this information-v --version           Display the program's versionarm-linux-androideabi-addr2line: supported targets: elf32-littlearm elf32-bigarm elf32-little elf32-big plugin srec symbolsrec verilog tekhex binary ihex
Report bugs to <http://source.android.com/source/report-bugs.html>下面让我来中文翻译一下:
命令格式:
arm-linux-androideabi-addr2line -e 需要调试的so库路径 内存地址

addr2line的工具在NDK和Android源码中都有集成,这里我以Android源码为演示,通过搜索可以发现很多的addr2line文件,我们需要选择适合自己的,我们这里使用的是arm-linux-androideabi-addr2line。

xxx$ find .  -name *addr2line*
./external/elfutils/0.153/src/addr2line.c
./external/mesa3d/src/gallium/tools/addr2line.sh
./external/chromium_org/build/android/pylib/symbols/mock_addr2line
./external/chromium_org/build/android/pylib/symbols/mock_addr2line/mock_addr2line
./external/chromium_org/third_party/tcmalloc/chromium/src/windows/addr2line-pdb.c
./external/chromium_org/third_party/tcmalloc/vendor/src/windows/addr2line-pdb.c
./external/chromium_org/third_party/tcmalloc/vendor/vsprojects/addr2line-pdb
./external/chromium_org/third_party/tcmalloc/vendor/vsprojects/addr2line-pdb/addr2line-pdb.vcproj
./external/chromium_org/third_party/mesa/src/src/gallium/tools/addr2line.sh
./ndk/sources/host-tools/ndk-stack/binutils/addr2line.c
./prebuilts/gcc/darwin-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-addr2line
./prebuilts/gcc/darwin-x86/aarch64/aarch64-linux-android-4.8/bin/aarch64-linux-android-addr2line
./prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-addr2line
./prebuilts/gcc/darwin-x86/arm/arm-eabi-4.8/bin/arm-eabi-addr2line
./prebuilts/gcc/darwin-x86/mips/mips64el-linux-android-4.9/bin/mips64el-linux-android-addr2line
./prebuilts/gcc/darwin-x86/mips/mipsel-linux-android-4.8/bin/mipsel-linux-android-addr2line
./prebuilts/gcc/darwin-x86/mips/mips64el-linux-android-4.8/bin/mips64el-linux-android-addr2line
./prebuilts/gcc/darwin-x86/x86/x86_64-linux-android-4.8/bin/x86_64-linux-android-addr2line
./prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-addr2line
./prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.8/bin/aarch64-linux-android-addr2line
./prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/bin/x86_64-linux-addr2line
./prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.8/bin/x86_64-linux-addr2line
./prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/bin/x86_64-w64-mingw32-addr2line
./prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/share/man/man1/x86_64-w64-mingw32-addr2line.1
./prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-addr2line
./prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-addr2line
./prebuilts/gcc/linux-x86/mips/mips64el-linux-android-4.9/bin/mips64el-linux-android-addr2line
./prebuilts/gcc/linux-x86/mips/mipsel-linux-android-4.8/bin/mipsel-linux-android-addr2line
./prebuilts/gcc/linux-x86/mips/mips64el-linux-android-4.8/bin/mips64el-linux-android-addr2line
./prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.8/bin/x86_64-linux-android-addr2line
./prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.9/bin/x86_64-linux-android-addr2line
./prebuilts/tools/gcc-sdk/addr2line
xxx$

同时在Android源码中source build/envsetup.sh和lunch以后,我们输入如下命令发现Android可以为我们补齐:

xxx$ arm-linux-androideabi-
arm-linux-androideabi-addr2line   arm-linux-androideabi-elfedit     arm-linux-androideabi-gcc-ranlib  arm-linux-androideabi-ld.gold     arm-linux-androideabi-size
arm-linux-androideabi-ar          arm-linux-androideabi-g++         arm-linux-androideabi-gcov        arm-linux-androideabi-nm          arm-linux-androideabi-strings
arm-linux-androideabi-as          arm-linux-androideabi-gcc         arm-linux-androideabi-gdb         arm-linux-androideabi-objcopy     arm-linux-androideabi-strip
arm-linux-androideabi-c++         arm-linux-androideabi-gcc-4.8     arm-linux-androideabi-gprof       arm-linux-androideabi-objdump
arm-linux-androideabi-c++filt     arm-linux-androideabi-gcc-ar      arm-linux-androideabi-ld          arm-linux-androideabi-ranlib
arm-linux-androideabi-cpp         arm-linux-androideabi-gcc-nm      arm-linux-androideabi-ld.bfd      arm-linux-androideabi-readelf

二.实际案例分析

   好了,有了前面的铺垫,让我们来一个实际案例分析一把,让我们浪起来。

DALVIK THREADS (23):
"main" prio=5 tid=1 Native| group="main" sCount=1 dsCount=0 obj=0x73698300 self=0xb73b40f0| sysTid=20557 nice=0 cgrp=default sched=0/0 handle=0xb6f15bec| state=S schedstat=( 15160273605 193890933 2101 ) utm=1424 stm=92 core=0 HZ=100| stack=0xbe2fb000-0xbe2fd000 stackSize=8MB| held mutexes=kernel: (couldn't read /proc/self/task/20557/stack)native: #00 pc 0000f9a8  /system/lib/libc.so (syscall+28)native: #01 pc 00013185  /system/lib/libc.so (_Z33__pthread_cond_timedwait_relativeP14pthread_cond_tP15pthread_mutex_tPK8timespec+56)native: #02 pc 0003b2e3  /system/lib/libhwui.so (???)native: #03 pc 0003b319  /system/lib/libhwui.so (???)native: #04 pc 00936c8b  /data/dalvik-cache/arm/system@framework@boot.oat (Java_android_view_ThreadedRenderer_nSyncAndDrawFrame__JJJF+134)at android.view.ThreadedRenderer.nSyncAndDrawFrame(Native method)at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:340)at android.view.ViewRootImpl.draw(ViewRootImpl.java:2548)at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2364)at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1994)at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1073)at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5903)at android.view.Choreographer$CallbackRecord.run(Choreographer.java:773)at android.view.Choreographer.doCallbacks(Choreographer.java:586)at android.view.Choreographer.doFrame(Choreographer.java:556)at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:759)at android.os.Handler.handleCallback(Handler.java:739)at android.os.Handler.dispatchMessage(Handler.java:95)at android.os.Looper.loop(Looper.java:135)at android.app.ActivityThread.main(ActivityThread.java:5259)at java.lang.reflect.Method.invoke!(Native method)at java.lang.reflect.Method.invoke(Method.java:372)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:697)

我们这里以#03为例进行分析,具体步骤如下:
(1) 找到没有优化的libhwui.so文件,当然是通过find了,如下

xxx$ find .  -name libhwui.so
./out/target/product/msm8909/system/lib/libhwui.so
./out/target/product/msm8909/obj/SHARED_LIBRARIES/libhwui_intermediates/LINKED/libhwui.so
./out/target/product/msm8909/obj/lib/libhwui.so
./out/target/product/msm8909/symbols/system/lib/libhwui.so  //这个是我么要使用的

(2) 找到内存地址“0003b319”
(3) 执行命令

xxx$ arm-linux-androideabi-addr2line -f -e  ./out/target/product/msm8909/symbols/system/lib/libhwui.so  0003b319
_ZN7android10uirenderer12renderthread13DrawFrameTask9drawFrameExx
xxx/frameworks/base/libs/hwui/renderthread/DrawFrameTask.cpp:77
xxx$

可以看到上面已经定位到了具体的行数了,就是这么简单丝滑。


总结

除了arm-linux-androideabi-addr2line找崩溃位置,Android的妈咪谷歌还我们提供了其它的功能,我们还可以用其它功能,所以说Android是一个大宝贝更多的功能等着我们去挖掘。
(1)输出动态so所有函数

   arm-linux-androideabi-readelf -a XX.so  > xx.txt

(2)反汇编so包

arm-linux-androideabi-objdump -dx XX.so > xx.txt

正确姿势使用arm-linux-androideabi-addr2line相关推荐

  1. 怎么用linux的HDD存储,Linux学习的正确姿势12:Linux存储概览

    原标题:Linux学习的正确姿势12:Linux存储概览 从工作原理区分 机械 HDD 固态 SSD SSD的优势 SSD是摒弃传统磁介质,采用电子存储介质进行数据存储和读取的一种技术,突破了传统机械 ...

  2. io在Linux,在Linux进行IO的正确姿势

    原标题:在Linux进行IO的正确姿势 很多C/C++程序虽然在做网络编程, 但大多用别人封装好的库, 对底层不甚了解, 感觉 IO 操作不是很简单吗? 我敢说, 大多数人进行 IO 的姿势都不对, ...

  3. Linux升级内核的正确姿势

    Linux升级内核的正确姿势 很多童鞋在玩耍linux发行版的时候,都会遇到各种各样的问题,比如:网卡不能使用,亮度不能调节,触摸板不能识别,蓝牙不能使用等等,这些关系都和linux的内核有关系. 什 ...

  4. Linux安装CUDA的正确姿势

    Linux安装CUDA的正确姿势 CUDA(Compute Unified Device Architecture,统一计算架构)是由NVIDIA所推出的一种集成技术,是该公司对于GPGPU的正式名称 ...

  5. 删除文件的正确姿势-Linux权限探索

    删除文件的正确姿势 在Linux系统中,要删除一个文件,到底需要用户拥有怎样的权限呢?这里做一个小小的探究. 首先用普通用户登录,在文件夹my下创建出mydir文件夹并进入,然后创建一个文件file ...

  6. Ubuntu下正确姿势使用GDB调试Android Native进程

        Ubuntu下正确姿势使用GDB调试Android Native进程 前言   对于Android Native进程大家是既爱又恨啊,爱的是它能为我们的Android世界带来别样的精彩,狠的是 ...

  7. Ubuntu创建新用户的正确姿势

    作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<Ubuntu 创建新用户的正确姿势>原文地址.更欢迎来我的小站看更多原创内容:godbmw.com,进行&q ...

  8. 【Qt开发】【VS开发】【Linux开发】OpenCV、Qt-MinGw、Qt-msvc、VS2010、VS2015、Ubuntu Linux、ARM Linux中几个特别容易混淆的内容...

    [Qt开发][VS开发][Linux开发]OpenCV.Qt-MinGw.Qt-msvc.VS2010.VS2015.Ubuntu Linux.ARM Linux中几个特别容易混淆的内容 标签:[Qt ...

  9. ARM linux的启动部分源代码简略分析

    ARM linux的启动部分源代码简略分析 以友善之臂的mini2440开发板为平台,以较新的内核linux-2.6.32.7版本为例,仅作说明之用. 当内核映像被加载到RAM之后,Bootloade ...

  10. 自学python需要买书吗-学习Python的正确姿势—基础教学,教科书该怎么买?

    学习Python的正确姿势-基础教学,教科书该怎么买? 2019-05-07 18:52:46 23点赞 377收藏 4评论 写在前面: 四月读书季,京东图书大促销,赶上优惠的尾巴,抢购了几本心水很久 ...

最新文章

  1. [AI开发]基于深度学习的视频多目标跟踪实现
  2. mysql表名忽略大小写
  3. MySQL 最新8.0版本windows系统下数据库的安装、配置与使用实例演示,客户端使用ip连接数据库失败问题处理
  4. memset 还可以这样用
  5. python画五角星代码_008-python绘制五个五角星
  6. mac版小达人点读包怎么安装_小达人点读笔扩容实战:16G变128G
  7. mysql cstmt_MySQL
  8. python安装matplotlib需要c编译_在Python 3.9上安装matplotlib提示需要FreeType更高版本的解决...
  9. java 高效加减乘除_java简单加减乘除
  10. 电商巨头Shopify 两名员工被指窃取客户交易详情
  11. 春季高考计算机专业专业分值,春季高考总分多少 分值分布情况如何
  12. 略谈人工智能算法的缺点
  13. DDoS攻击的工具介绍
  14. @JsonFormat和@DataFormat注解解决前后端日期格式一致性问题
  15. python与开源gis空间分析_Python 与开源GIS —数据处理、空间分析与地图制图
  16. android登录功能实现代码,功能强大的登录界面Android实现代码
  17. 广西壮族自治区公安厅信息中心异地容灾系统(三期)采购185万
  18. mysql mtq_Mysql 入门学习指南
  19. edge通常不会下载xxxx确保信任xxx怎么解决
  20. 数学基础 - 第十七章 勾股定理

热门文章

  1. MUI框架-01-介绍-创建项目-简单页面
  2. 【NetApp】NetApp存储设备的CPU使用率分析
  3. 盲目的相信——写在购买陆谷孙先生主编的《英汉大词典》之后
  4. 三菱 PLC通讯 MX-Component5.0 官方demo
  5. 【Bandit Algorithms学习笔记】EXP3算法理论证明
  6. 使用liteide开发go问题收集
  7. H5自适应简约浪漫婚礼邀请函HTML源码
  8. matlab GUIz之guide
  9. 【统计信号处理检测理论:二维CFAR】
  10. 系统集成项目管理工程师计算题(进度管理总浮动时间、自由浮动时间、工期)