前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Android NDK 开发】NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 使用 addr2line 命令行工具查找动态库中的报错代码位置 )

【Android NDK 开发】NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 使用 addr2line 命令行工具查找动态库中的报错代码位置 )

作者头像
韩曙亮
发布2023-03-30 16:13:07
1K0
发布2023-03-30 16:13:07
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

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 内容如下 :

代码语言:javascript
复制
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
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 处查找报错点 :

代码语言:javascript
复制
#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 位的动态库 , 需要使用 的 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 地址的代码 ;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、从 Tombstone 报错日志中查找报错动态库
  • 二、addr2line 命令行工具使用
    • 64 位动态库使用的 aarch64-linux-android-addr2line.exe 工具
      • 32 位动态库使用的 arm-linux-androideabi-addr2line.exe 工具
        • 使用 addr2line 命令行工具分析动态库
        相关产品与服务
        命令行工具
        腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档