天天看點

【Android NDK 開發】NDK C/C++ 代碼崩潰調試 - Tombstone 報錯資訊日志檔案分析 ( 使用 addr2line 指令行工具查找動态庫中的報錯代碼位置 )

文章目錄

  • ​​一、從 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 工具 ;

【Android NDK 開發】NDK C/C++ 代碼崩潰調試 - Tombstone 報錯資訊日志檔案分析 ( 使用 addr2line 指令行工具查找動态庫中的報錯代碼位置 )

32 位動态庫使用的 arm-linux-androideabi-addr2line.exe 工具

注意 , 不同類型的動态庫使用不同的

ndk-bundle\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin

目錄下的 arm-linux-androideabi-addr2line.exe ;

【Android NDK 開發】NDK C/C++ 代碼崩潰調試 - Tombstone 報錯資訊日志檔案分析 ( 使用 addr2line 指令行工具查找動态庫中的報錯代碼位置 )

使用 addr2line 指令行工具分析動态庫

執行