Android NDK 开发NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 使用 addr2line 命令行工具查找动态库中的报错代码位置 )
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android NDK 开发NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 使用 addr2line 命令行工具查找动态库中的报错代码位置 )相关的知识,希望对你有一定的参考价值。
文章目录
Tombstone 报错信息日志文件被保存在了 /data/tombstones/ 目录下 , 先 ROOT 再说 , 没有 ROOT 权限无法访问该目录中的信息 ;
使用 Pixel 2 手机进行调试 , 其它 ROOT 后的手机也可以使用 ;
ROOT 前先 解锁 Bootloader , 参考博客 【Android】Pixel 2 解锁 Bootloader
ROOT 操作 , 参考博客 【Android】Pixel 2 Android 9 系统 ROOT 操作 ( TWRP 下载 | Magisk Manager 下载 | 线刷包下载 | 线刷 9.0 系统 | ROOT 操作 )
参考 【Android NDK 开发】NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 获取 tombstone_0X 崩溃日志信息 ) 博客 , 先获取 NDK 的报错日志信息 Tombstone 文件 ;
一、从 Tombstone 报错日志中查找报错动态库
参考 【Android NDK 开发】NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 获取 tombstone_0X 崩溃日志信息 ) 博客 , 在上述博客中 , 获取到了 Tombstone 内容如下 :
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'google/walleye/walleye:9/PQ3A.190801.002/5670241:user/release-keys'
Revision: 'MP1'
ABI: 'arm64'
pid: 11561, tid: 11575, name: Binder:11561_3 >>> com.tombstone.demo:process <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xc
Cause: null pointer dereference
Abort message: 'art_method.cc:611] Check failed: existing_entry_point != nullptr void android.accessibilityservice.AccessibilityService.<init>()@0x7e70e6f588'
x0 0000000000000000 x1 0000000000000000 x2 0000007e86085ca1 x3 0000000000000000
x4 0000000000000000 x5 0000007e7dc69b6f x6 000000000000000a x7 000000000000000a
x8 7af92b4d5bbf85bd x9 7af92b4d5bbf85bd x10 0000000000000000 x11 0000007f068804a8
x12 20646c6568207c20 x13 3d7365786574756d x14 00000000ffffffff x15 0000007f0687fc18
x16 0000007e8612bef0 x17 0000007f097679b0 x18 0000007f0687f69a x19 0000007f06880480
x20 0000000000000000 x21 0000007e86051f10 x22 0000000000000000 x23 0000007e70e6f588
x24 0000000000000001 x25 0000000000000000 x26 0000000000000000 x27 0000007e863434a0
x28 0000000000000001 x29 0000007f068802c0
sp 0000007f068802b0 lr 0000007e85f9162c pc 0000007e85f91630
backtrace:
#00 pc 00000000004a5630 /system/lib64/libart.so (art::CurrentMethodVisitor::VisitFrame()+24)
#01 pc 0000000000484608 /system/lib64/libart.so (_ZN3art12StackVisitor9WalkStackILNS0_16CountTransitionsE0EEEvb+1656)
#02 pc 0000000000495d9c /system/lib64/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool, BacktraceMap*, bool) const+316)
#03 pc 00000000004afd5c /system/lib64/libart.so (art::DumpCheckpoint::Run(art::Thread*)+844)
#04 pc 00000000004a8a9c /system/lib64/libart.so (art::ThreadList::RunCheckpoint(art::Closure*, art::Closure*)+476)
#05 pc 00000000004a7cd4 /system/lib64/libart.so (art::ThreadList::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool)+500)
#06 pc 000000000046a9d0 /system/lib64/libart.so (art::Runtime::Abort(char const*)+392)
#07 pc 0000000000008d2c /system/lib64/libbase.so (android::base::LogMessage::~LogMessage()+724)
#08 pc 00000000000d07f0 /system/lib64/libart.so (art::ArtMethod::GetOatQuickMethodHeader(unsigned long)+608)
#09 pc 00000000001a0d0c /system/lib64/libart.so (art::FaultManager::IsInGeneratedCode(siginfo*, void*, bool)+908)
#10 pc 00000000001a0654 /system/lib64/libart.so (art::FaultManager::HandleFault(int, siginfo*, void*)+92)
#11 pc 0000000000002b80 /system/bin/app_process64 (art::SignalChain::Handler(int, siginfo*, void*)+568)
#12 pc 000000000000088c [vdso:0000007f0bc35000]
#13 pc 0000000000553bcc /system/lib64/libart.so (ExecuteMterpImpl+33356)
#14 pc 0000000000390f46 /system/framework/boot-framework.vdex (android.app.ContextImpl.sendBroadcast+94)
#15 pc 0000000000255e68 /system/lib64/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.2088410233+496)
#16 pc 000000000025b9e8 /system/lib64/libart.so (art::interpreter::ArtInterpreterToInterpreterBridge(art::Thread*, art::CodeItemDataAccessor const&, art::ShadowFrame*, art::JValue*)+216)
在 backtrace 处查找报错点 :
#00 pc 00000000004a5630 /system/lib64/libart.so
(art::CurrentMethodVisitor::VisitFrame()+24)
由上面可以看到 , 出错的位置是 /system/lib64/libart.so 动态库的 0x00000000004a5630 地址 , 具体的该地址对应的代码 , 需要通过 addr2line 命令行工具进行确定 ;
二、addr2line 命令行工具使用
64 位动态库使用的 aarch64-linux-android-addr2line.exe 工具
在 Android NDK 开发中 , 使用的 addr2line 命令行工具是在 SDK 的
ndk-bundle\\toolchains\\aarch64-linux-android-4.9\\prebuilt\\windows-x86_64\\bin
目录下的 aarch64-linux-android-addr2line.exe 工具 ;
32 位动态库使用的 arm-linux-androideabi-addr2line.exe 工具
注意 , 不同类型的动态库使用不同的 32 32 32 位的动态库 , 需要使用 的 addr2line 命令行工具是在 SDK 的
ndk-bundle\\toolchains\\arm-linux-androideabi-4.9\\prebuilt\\windows-x86_64\\bin
目录下的 arm-linux-androideabi-addr2line.exe ;
使用 addr2line 命令行工具分析动态库
执行
aarch64-linux-android-addr2line.exe -e xx/libart.so 00000000004a5630
命令 , 即可分析 xx/libart.so 动态库的 0x00000000004a5630 地址的代码 ;
以上是关于Android NDK 开发NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 使用 addr2line 命令行工具查找动态库中的报错代码位置 )的主要内容,如果未能解决你的问题,请参考以下文章