正确姿势使用arm-linux-androideabi-addr2line
正确姿势使用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相关推荐
- 怎么用linux的HDD存储,Linux学习的正确姿势12:Linux存储概览
原标题:Linux学习的正确姿势12:Linux存储概览 从工作原理区分 机械 HDD 固态 SSD SSD的优势 SSD是摒弃传统磁介质,采用电子存储介质进行数据存储和读取的一种技术,突破了传统机械 ...
- io在Linux,在Linux进行IO的正确姿势
原标题:在Linux进行IO的正确姿势 很多C/C++程序虽然在做网络编程, 但大多用别人封装好的库, 对底层不甚了解, 感觉 IO 操作不是很简单吗? 我敢说, 大多数人进行 IO 的姿势都不对, ...
- Linux升级内核的正确姿势
Linux升级内核的正确姿势 很多童鞋在玩耍linux发行版的时候,都会遇到各种各样的问题,比如:网卡不能使用,亮度不能调节,触摸板不能识别,蓝牙不能使用等等,这些关系都和linux的内核有关系. 什 ...
- Linux安装CUDA的正确姿势
Linux安装CUDA的正确姿势 CUDA(Compute Unified Device Architecture,统一计算架构)是由NVIDIA所推出的一种集成技术,是该公司对于GPGPU的正式名称 ...
- 删除文件的正确姿势-Linux权限探索
删除文件的正确姿势 在Linux系统中,要删除一个文件,到底需要用户拥有怎样的权限呢?这里做一个小小的探究. 首先用普通用户登录,在文件夹my下创建出mydir文件夹并进入,然后创建一个文件file ...
- Ubuntu下正确姿势使用GDB调试Android Native进程
Ubuntu下正确姿势使用GDB调试Android Native进程 前言 对于Android Native进程大家是既爱又恨啊,爱的是它能为我们的Android世界带来别样的精彩,狠的是 ...
- Ubuntu创建新用户的正确姿势
作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<Ubuntu 创建新用户的正确姿势>原文地址.更欢迎来我的小站看更多原创内容:godbmw.com,进行&q ...
- 【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 ...
- ARM linux的启动部分源代码简略分析
ARM linux的启动部分源代码简略分析 以友善之臂的mini2440开发板为平台,以较新的内核linux-2.6.32.7版本为例,仅作说明之用. 当内核映像被加载到RAM之后,Bootloade ...
- 自学python需要买书吗-学习Python的正确姿势—基础教学,教科书该怎么买?
学习Python的正确姿势-基础教学,教科书该怎么买? 2019-05-07 18:52:46 23点赞 377收藏 4评论 写在前面: 四月读书季,京东图书大促销,赶上优惠的尾巴,抢购了几本心水很久 ...
最新文章
- [AI开发]基于深度学习的视频多目标跟踪实现
- mysql表名忽略大小写
- MySQL 最新8.0版本windows系统下数据库的安装、配置与使用实例演示,客户端使用ip连接数据库失败问题处理
- memset 还可以这样用
- python画五角星代码_008-python绘制五个五角星
- mac版小达人点读包怎么安装_小达人点读笔扩容实战:16G变128G
- mysql cstmt_MySQL
- python安装matplotlib需要c编译_在Python 3.9上安装matplotlib提示需要FreeType更高版本的解决...
- java 高效加减乘除_java简单加减乘除
- 电商巨头Shopify 两名员工被指窃取客户交易详情
- 春季高考计算机专业专业分值,春季高考总分多少 分值分布情况如何
- 略谈人工智能算法的缺点
- DDoS攻击的工具介绍
- @JsonFormat和@DataFormat注解解决前后端日期格式一致性问题
- python与开源gis空间分析_Python 与开源GIS —数据处理、空间分析与地图制图
- android登录功能实现代码,功能强大的登录界面Android实现代码
- 广西壮族自治区公安厅信息中心异地容灾系统(三期)采购185万
- mysql mtq_Mysql 入门学习指南
- edge通常不会下载xxxx确保信任xxx怎么解决
- 数学基础 - 第十七章 勾股定理