如何使用arm-linux-androideabi-addr2line

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用arm-linux-androideabi-addr2line相关的知识,希望对你有一定的参考价值。

1.将ndk中的arm-linux-androideabi-addr2line可执行文件的路径加入配置文件~/.bashrc中,例如:
export PATH=$PATH:~/dlna/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin

2.使配置生效:source ~/.bashrc

3.使用工具。例如:arm-linux-androideabi-addr2line -C -f -e ~/workspace/DLNA/libs/armeabi/libctrlpt.so 0003deb4
其中,0003deb4为堆栈信息中pc的值。

android应用崩溃的调试方法
有两种方法可以分析 crash 的堆栈信息
1 google提供了一个python脚本,可以从
http://code.google.com/p/android-ndk-stacktrace-analyzer/
下载这个python脚本,然后使用 adb logcat -d > logfile 导出 crash 的log,
使用 arm-eabi-objdump 位于build/prebuilt/linux-x86/arm-eabi-4.2.1/bin下面
把so或exe转换成汇编代码,如:arm-eabi-objdump -S mylib.so > mylib.asm,
使用脚本
python parse_stack.py <asm-file> <logcat-file>
2 直接使用NDK下面的arm-linux-androideabi-addr2line
(D:\\android-ndk-r8\\toolchains\\arm-linux-
androideabi-4.4.3\\prebuilt\\windows\\bin\\arm-linux-androideabi-addr2line.exe)
例如:arm-linux-androideabi-addr2line -C -f -e libxxx.so 0x#####(address)

android调试工具addr2line使用补充
使用addr2line追踪自有动态库(so文件)的bug, 补充:
解决出现 ??:0 , 没法展示源代码行数的问题

在Android.mk 文件中:

Java代码
LOCAL_CFLAGS
:=
-D__STDC_CONSTANT_MACROS
-Wl,-Map=test.map
-g

补充2个编译参数 -Wl,-Map=test.map -g .
增加gcc警告和调试标志

arm-linux-androideabi-addr2line -C -f -e /项目目录/obj/local/armeabi/libfaa_jni.so 0024362e

tip: 1,注意调试文件的位置在obj目录下,并非libs目录下生成的so文件
2,0024362e 为出错的机制位置

还有:
在jni/目录下增加Application.mk 文件, 修改为debug 模式,进行调试 APP_OPTIM := debug
参考技术A 明显:arm-linux-androideabi-g++找进入目录:prebuilt/linux-x86/ccache/ccache prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin/ 看否文件或链接文件: arm-linux-androideabi-addr2line arm-linux-androideabi-gprof arm-linu... 参考技术B 1.将ndk中的arm-linux-androideabi-addr2line可执行文件的路径加入配置文件~/.bashrc中,例如:
export PATH=$PATH:~/dlna/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin

2.使配置生效:source ~/.bashrc

3.使用工具。例如:arm-linux-androideabi-addr2line -C -f -e ~/workspace/DLNA/libs/armeabi/libctrlpt.so 0003deb4
其中,0003deb4为堆栈信息中pc的值。

android应用崩溃的调试方法
有两种方法可以分析 crash 的堆栈信息
1 google提供了一个python脚本,可以从
http://code.google.com/p/android-ndk-stacktrace-analyzer/
下载这个python脚本,然后使用 adb logcat -d > logfile 导出 crash 的log,
使用 arm-eabi-objdump 位于build/prebuilt/linux-x86/arm-eabi-4.2.1/bin下面
把so或exe转换成汇编代码,如:arm-eabi-objdump -S mylib.so > mylib.asm,
使用脚本
python parse_stack.py <asm-file> <logcat-file>
2 直接使用NDK下面的arm-linux-androideabi-addr2line
(D:\android-ndk-r8\toolchains\arm-linux-
androideabi-4.4.3\prebuilt\windows\bin\arm-linux-androideabi-addr2line.exe)
例如:arm-linux-androideabi-addr2line -C -f -e libxxx.so 0x#####(address)

android调试工具addr2line使用补充
使用addr2line追踪自有动态库(so文件)的bug, 补充:
解决出现 ??:0 , 没法展示源代码行数的问题

在Android.mk 文件中:

Java代码
LOCAL_CFLAGS
:=
-D__STDC_CONSTANT_MACROS
-Wl,-Map=test.map
-g

补充2个编译参数 -Wl,-Map=test.map -g .
增加gcc警告和调试标志

arm-linux-androideabi-addr2line -C -f -e /项目目录/obj/local/armeabi/libfaa_jni.so 0024362e

tip: 1,注意调试文件的位置在obj目录下,并非libs目录下生成的so文件
2,0024362e 为出错的机制位置

还有:
在jni/目录下增加Application.mk 文件, 修改为debug 模式,进行调试 APP_OPTIM := debug

libz.so.1:无法打开共享对象文件

【中文标题】libz.so.1:无法打开共享对象文件【英文标题】:libz.so.1: cannot open shared object file 【发布时间】:2014-02-10 23:20:24 【问题描述】:

我在 ubuntu 12.04 上遇到了一个问题:

/usr/lib/ndk/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/。 ./../../../arm-linux-androideabi/bin/as: 加载共享库时出错:libz.so.1:无法打开共享 目标文件:没有这样的文件或目录

我试过了

sudo apt-get install lib32z1

但它说

读取包列表...完成构建依赖树读取 状态信息... 完成 lib32z1 已经是最新版本。 0 已升级,0 个新安装,0 个要移除,610 个未升级。

请提出解决方案。

【问题讨论】:

【参考方案1】:

这对我有用

sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5

【讨论】:

对于 CentOS,我需要同时安装 zlib 和 libgcc。百胜安装 zlib.i686 libgcc【参考方案2】:

检查 libz.so.1 属于哪个包 (http://packages.ubuntu.com/lucid/i386/zlib1g/filelist) 后,您应该尝试安装 zlib1g:

sudo apt-get install zlib1g

正如@E-rich 所指出的,可能需要在包名称中添加一个 :i386 后缀,以便包管理器正确识别它:

sudo apt-get install zlib1g:i386

EDIT(用于 CentOS 或其他使用 yum 的发行版):

如果有人使用 CentOS(或任何其他使用 yum 的发行版)最终可能会阅读此问题,@syslogic 在 cmets 中提出了以下解决方案:

yum install zlib.i686

或者,对于 32 位二进制文​​件:

yum install zlib.i386

【讨论】:

这对我有用,只是做了一个小改动:sudo apt-get install zlib1g:i386 @Palak yum install zlib.i686 经过这么多搜索终于。 sudo apt-get install zlib1g:i386 工作。 2016 年 5 月,安装 zlib1g:i386 仍然适用于 ubuntu 15.10。 +1 Android Studio 2.2.3,Oracle Java 8,Android Build-Tools 23.0.2 in Ubuntu 16.04.1 amd64,这对我有用sudo apt-get install zlib1g:i386【参考方案3】:

我已经下载了这些包:

libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 zlib1g

然后我解压它们并将目录添加到我的~/.bashrc 中的LD_LIBRARY_PATH。只需确保在路径中添加正确的目录即可。

【讨论】:

说实话 - 我不知道。我刚刚做了find `pwd` -type d | xargs | tr " " ":" 来生成所有子目录的完整列表。但可能有一些文档可以准确地说明它们是什么。我的时间很短,所以我不得不猜测:-)【参考方案4】:

查看以下链接: 特别是“安装 32 位库(如果您使用 64 位)”

 https://github.com/meteor/meteor/wiki/Mobile-Dev-Install:-Android-on-Linux

【讨论】:

这终于对我有用了“sudo apt-get update; sudo apt-get install --yes lib32z1 lib32stdc++6”【参考方案5】:

sudo apt-get install zlib1g:i386 在 Xubuntu 16.04 上修复了 Android 2.1.1 上的 Gradle 问题。

【讨论】:

【参考方案6】:

对于 Fedora(可能对某人有用)

sudo dnf install zlib-1.2.8-10.fc24.i686 libgcc-6.1.1-2.fc24.i686

【讨论】:

【参考方案7】:

对于 centos,只是 zlib 没有解决问题。我做到了 sudo yum install zlib-devel.i686

【讨论】:

【参考方案8】:

对于 Arch Linux,它是来自 multilib 的 pacman -S lib32-zlib,而不是 zlib

【讨论】:

以上是关于如何使用arm-linux-androideabi-addr2line的主要内容,如果未能解决你的问题,请参考以下文章

关于Android报找不到arm-linux-androideabi的错误

关于Android报找不到arm-linux-androideabi的错误

Fultter 实战No toolchains found in the NDK toolchains folder for ABI arm-linux-androideabi

Fultter 实战No toolchains found in the NDK toolchains folder for ABI arm-linux-androideabi

配置不识别androideabi

android NDK编译问题,在将项目中的JNI部分编译时,报出了错误,不能成功生成SO文件,