文章目錄
- 一、從 Tombstone 報錯日志中查找報錯動态庫
- 二、addr2line 指令行工具使用
- 64 位動态庫使用的 aarch64-linux-android-addr2line.exe 工具
- 32 位動态庫使用的 arm-linux-androideabi-addr2line.exe 工具
- 使用 addr2line 指令行工具分析動态庫
Tombstone 報錯資訊日志檔案被儲存在了 /data/tombstones/
使用 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 工具 ;
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiATN381dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yM4IjMzUDN3QWZlJWMxADMzYzX2AjM0YDMwIzLchDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
32 位動态庫使用的 arm-linux-androideabi-addr2line.exe 工具
注意 , 不同類型的動态庫使用不同的
ndk-bundle\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin
目錄下的 arm-linux-androideabi-addr2line.exe ;
使用 addr2line 指令行工具分析動态庫
執行