addr2line工具的作用是将地址转化为对应代码行的工具,有助于定位native层问题。由于最近遇到了相关问题需要使用该工具,所以这里总结一下(仅涉及Linux环境)。
一、工具使用
网上很多旧有资料都是推荐使用Android Studio SDK的 ndk 中或aosp自带的 addr2line 工具。
1.ndk 中的 addr2line(ndk版本23之前):
32位:/Android/Sdk/ndk/版本号/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-addr2line
64位: /Android/Sdk/ndk/版本号/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-addr2line
2.AOSP 自带addr2line(仅32位):
./prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-addr2line
工具的使用方法都是一样的,举例如下:
./prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-addr2line -f -e out/debug/target/product/XXXX/symbols/system/lib/libstagefright.so 0007cd0f
_ZN7android14MPEG4Extractor10parseChunkEPxi
/home/XXX/source/XXX/LINUX/android/frameworks/av/media/libstagefright/MPEG4Extractor.cpp:2180 (discriminator 1)
二、其他工具
ndk 从版本23之后就移除了 toolchain 目录中的 aarch64-linux-android-4.9 和 arm-linux-androideabi-4.9。如果使用旧版的工具解析新版本目标文件可能会报错。此时可使用下面的替代方案:
1.使用 AOSP 自带的 llvm-addr2line 工具
./prebuilts/clang/host/linux-x86/llvm-binutils-stable/llvm-addr2line ./prebuilts/clang/host/linux-x86/clang-r450784d/bin/llvm-addr2line
该工具的使用方法与上面的一样:
prebuilts/clang/host/linux-x86/llvm-binutils-stable/llvm-addr2line -fe '/symbols/system/bin/installd' 00049964
_ZNSt3__15dequeINS_7__stateIcEENS_9allocatorIS2_EEE4backEv
external/libcxx/include/deque:1809
2.使用NDK 中的 llvm-symbolizer
在新版本的 ndk 的路径下也有与 aosp 自带的 llvm-addr2line 同名的工具 /Android/Sdk/ndk/版本/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-addr2line。查看该文件其实是指向同目录名下的另一个文件llvm-symbolizer的链接。所以真正使用的是llvm-symbolizer。
llvm-symbolizer使用方法参考 adtxl.com/index.php/a…
三、常见问题
1.File format not recognized
工具与目标文件格式(位数)不匹配,使用对应32位/64位的工具解析。
2.aarch64-linux-android-addr2line:未找到命令
将工具路径添加到PATH。
3.aarch64-linux-android-addr2line: Dwarf Error: found dwarf version '5', this reader only handles version 2, 3 and 4 information.
工具不支持目标文件的版本,需要更新工具或降级编译目标文件(一般需要使用其他替代的工具)。
后续遇到其他问题还会继续补充。