安卓系统常见问题如native crash,卡顿卡死定位工具命令技巧-android framework实战开发

news2024/9/26 15:04:30

背景:

有学员朋友近来有问到一些安卓系统开发过程中的一些核心小技能小技巧等,比如native crash在企业里面该如何准确定位具体代码函数,程序卡住,或者长时间没反应,想要看看卡在代码的哪里。针对以上的一些问题,我这边分享一些工作中常用积极该类问题的一些辅助工具命令技巧,帮助大家更好的在工作中定位这类问题。

Native Crash堆栈分析工具实战

先看看常见native日志中可以获取的堆栈情况


09-24 16:34:53.233  6918  6918 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
09-24 16:34:53.233  6918  6918 F DEBUG   : LineageOS Version: '21.0-20240413-UNOFFICIAL-nx563j'
09-24 16:34:53.233  6918  6918 F DEBUG   : Build fingerprint: 'nubia/NX563J/NX563J:7.1.1/NMF26X/eng.nubia.20171019.101529:user/release-keys'
09-24 16:34:53.233  6918  6918 F DEBUG   : Revision: '0'
09-24 16:34:53.233  6918  6918 F DEBUG   : ABI: 'arm64'
09-24 16:34:53.233  6918  6918 F DEBUG   : Timestamp: 2024-09-24 16:34:53.213262674+0800
09-24 16:34:53.233  6918  6918 F DEBUG   : Process uptime: 3s
09-24 16:34:53.233  6918  6918 F DEBUG   : Cmdline: robert -rec:/data/event
09-24 16:34:53.234  6918  6918 F DEBUG   : pid: 6914, tid: 6914, name: robert  >>> robert <<<
09-24 16:34:53.234  6918  6918 F DEBUG   : uid: 0
09-24 16:34:53.234  6918  6918 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0000000000000000
09-24 16:34:53.234  6918  6918 F DEBUG   : Cause: null pointer dereference
09-24 16:34:53.234  6918  6918 F DEBUG   :     x0  0000006404f5c28c  x1  0000006404f5cd12  x2  0000000000000000  x3  0045565f00000000
09-24 16:34:53.234  6918  6918 F DEBUG   :     x4  0000008000000000  x5  0000000000000000  x6  0000000080000000  x7  454b005342415f57
09-24 16:34:53.234  6918  6918 F DEBUG   :     x8  4acdd30573c30611  x9  0000000000000000  x10 0000000000000001  x11 0000006404f5dde8
09-24 16:34:53.234  6918  6918 F DEBUG   :     x12 0000006404f5dcde  x13 0000000000000000  x14 0000000000000001  x15 0000000000000000
09-24 16:34:53.234  6918  6918 F DEBUG   :     x16 0000006404f64c08  x17 00000077aa0ce500  x18 00000077ab97c000  x19 0000000000000009
09-24 16:34:53.234  6918  6918 F DEBUG   :     x20 0000006404f5baad  x21 0000006404f66000  x22 00000077aae3f000  x23 0000007ff03cad80
09-24 16:34:53.234  6918  6918 F DEBUG   :     x24 0000007ff03cad80  x25 0000000000000000  x26 0000000000000000  x27 0000006404f66000
09-24 16:34:53.234  6918  6918 F DEBUG   :     x28 0000006404f5cd12  x29 0000007ff03cad00
09-24 16:34:53.234  6918  6918 F DEBUG   :     lr  0000006404f60b58  sp  0000007ff03cacd0  pc  0000006404f5ff18  pst 0000000000000000
09-24 16:34:53.234  6918  6918 F DEBUG   : 4 total frames
09-24 16:34:53.234  6918  6918 F DEBUG   : backtrace:
09-24 16:34:53.234  6918  6918 F DEBUG   :       #00 pc 0000000000009f18  /system/bin/robert (print_all_event()+60) (BuildId: 52b288fb7098ea1a378db332a4c000bf)
09-24 16:34:53.234  6918  6918 F DEBUG   :       #01 pc 000000000000ab54  /system/bin/robert (startRecord()+2620) (BuildId: 52b288fb7098ea1a378db332a4c000bf)
09-24 16:34:53.234  6918  6918 F DEBUG   :       #02 pc 000000000000afd8  /system/bin/robert (recordEvent(char*)+228) (BuildId: 52b288fb7098ea1a378db332a4c000bf)
09-24 16:34:53.234  6918  6918 F DEBUG   :       #03 pc 0000000000052610  /apex/com.android.runtime/lib64/bionic/libc.so (__libc_init+104) (BuildId: c74277f481a383c87215b672f6465e24)

上面堆栈都是一些地址码和大概的函数堆栈,所以一般没办法直接和java代码一样定位到具体的行数等。一般user版本也就只有上面的crash的堆栈信息,虽然没办法定位到具代码crash行数,但是可以得到一些线索:

1、根据堆栈可以得出这个其实是一个空指针的crash在这里插入图片描述
2、crash的地方可以大概定位到是在 /system/bin/robert 的print_all_event()方法
在这里插入图片描述但是具体函数user版本的话就看不出来,如果可以复现的话其实这个问题也好处理,因为可以考虑直接系统上复现,使用源码进行debug到具体函数,再不行还可一行行打log也可以缩小定位。

有源码+可以复现crash情况下,可以使用工具llvm-addr2line定位具体代码行数,方法如下:

~/test/aosp/out/target/product/xxx/symbols/system/lib64$ ~/test/aosp/prebuilts/clang/host/linux-x86/clang-r416183b/bin/llvm-addr2line -Cfe xxx.so(或者bin) xxxx(16进制地址)
xxxxx(方法全名)

上面来举例,堆栈获取最顶部的一行

#00 pc 0000000000009f18 /system/bin/robert (print_all_event()+60)

0000000000009f18就是16进制地址 robert就是bin print_all_event方法
就拿上面案例来测试:

test@test:~/disk2/nx563j_aosp14/out/target/product/nx563j/symbols/system/bin$ ~/disk2/nx563j_aosp14/prebuilts/clang/host/linux-x86/clang-r487747c/bin/llvm-addr2line -Cfe robert 0000000000009f18 print_all_event
testNull()
robert/getevent.cpp:270
print_all_event

去除路径核心就是 :
llvm-addr2line -Cfe robert 0000000000009f18 print_all_event
在这里插入图片描述

上面经过工具后既可以得到出错代码是在
robert/getevent.cpp:270
下面看看这个270行代码
在这里插入图片描述确实有空指针

进程卡住,卡顿定位backtrace获取分析

经常调试偶尔发现app可能卡住,没反应的情况,这个时候就很希望知道卡住这时候的进程的一个运行情况,希望可以得到一个和anr trace一样的文件来方便分析定位线程状态,即想要获取进程的backtrace。
注意获取进程backtrace方法都需要root

apk打印出当前进程backtrace

使用命令:

kill -3 pid (只针对apk类型的生效)

执行后在/data/anr/目录生成backtrace文件

NX563J:/ # ps -A | grep anr                                                                                                                                                                                       
u0_a181       7449 22013   14655980  76492 futex_wait_queue_me 0 S com.example.anrdemo
NX563J:/ # kill -3 7449

pull出anr下面的文件及打开:

adb pull /data/anr ~/tmp/

在这里插入图片描述

在这里插入图片描述可以看出卡顿时候其实是main主线程卡在onResume方法里面,线程处于sleep
在这里插入图片描述

native程序打印backtrace

使用debuggerd 命令
debuggerd -b pid (针对native bin)

案例如下:
robert进程的backtrace

NX563J:/ # ps -A | grep robert
root          7629  7622   10830444   1872 do_sys_poll         0 S robert
NX563J:/ # debuggerd -b 7629


----- pid 7629 at 2024-09-24 17:14:02.315686219+0800 -----
Cmd line: robert -rec:/data/event
ABI: 'arm64'

"robert" sysTid=7629
    #00 pc 00000000000ab758  /apex/com.android.runtime/lib64/bionic/libc.so (__ppoll+8) (BuildId: c74277f481a383c87215b672f6465e24)
    #01 pc 0000000000065ed0  /apex/com.android.runtime/lib64/bionic/libc.so (poll+92) (BuildId: c74277f481a383c87215b672f6465e24)
    #02 pc 000000000000a2b4  /system/bin/robert (startRecord()+424) (BuildId: 7005ff744c2b0ed72a670bb8f0bd61e9)
    #03 pc 000000000000afcc  /system/bin/robert (recordEvent(char*)+228) (BuildId: 7005ff744c2b0ed72a670bb8f0bd61e9)
    #04 pc 0000000000052610  /apex/com.android.runtime/lib64/bionic/libc.so (__libc_init+104) (BuildId: c74277f481a383c87215b672f6465e24)

----- end 7629 -----

更多framework详细代码和资料参考如下链接
投屏专题部分:
https://mp.weixin.qq.com/s/IGm6VHMiAOPejC_H3N_SNg
hal+perfetto+surfaceflinger

https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
其他课程七件套专题:在这里插入图片描述
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

参考相关链接:
https://blog.csdn.net/zhimokf/article/details/137958615

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2163697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中电金信:源启智能视觉分析系统~助力各行业破局升级,释放新质生产力

作为人工智能与计算机视觉的交叉范畴&#xff0c;智能视觉模仿人类视觉机能&#xff0c;来对各种形式的视觉输入予以处理、理解以及决策。当下&#xff0c;智能视觉已然发展为应用广泛、市场覆盖面大且形式多元的产业方向&#xff0c;获得了国家政策的强力支持。数字化时代搭台…

开源模型应用落地-qwen2.5-7b-instruct-LoRA微调-LLaMA-Factory-单机单卡-V100(十八)

一、前言 本篇文章将使用LLaMA-Factory去高效微调(命令和界面方式)QWen2.5系列模型,通过阅读本文,您将能够更好地掌握这些关键技术,理解其中的关键技术要点,并应用于自己的项目中。 QWen2系列模型微调: 开源模型应用落地-qwen2-7b-instruct-LoRA微调-LLaMA-Factory-单机单…

MySQL Mail服务器集成:如何配置发送邮件?

MySQL Mail插件使用指南&#xff1f;怎么优化 MySQL发邮件性能&#xff1f; MySQL Mail服务器的集成&#xff0c;使得数据库可以直接触发邮件发送&#xff0c;极大地简化了应用架构。AokSend将详细介绍如何配置MySQL Mail服务器&#xff0c;以实现邮件发送功能。 MySQL Mail&…

IDEA相关设置总结

目录 1.设置JDK 2.设置忽略大小写检查 3.设置字体大小 4.设置类的信息 5.包名分级 1.设置JDK 2.设置忽略大小写检查 3.设置字体大小 4.设置类的信息 5.包名分级 取消勾选

利用低代码快速搭建电商小程序之商品列表页

目标&#xff1a; 搭建商城的一个商品列表页面&#xff08;先做静态页&#xff09; 开发环境&#xff1a; 访问白码低代码平台&#xff1a;https://www.bnocode.com/ 白码的新自定义页功能&#xff08;使用vue框架&#xff09; 前期准备&#xff1a; 需要先准备商品数据表…

数据结构:Heap堆应用(堆排序,TOP-K问题)手把手带你入门数据结构~

文章目录 前言一、堆排序1. 数据入堆2. 堆排序3. 时间复杂度&#xff08;1&#xff09;冒泡排序时间复杂度&#xff08;2&#xff09;向上调整建堆的时间复杂度&#xff08;3&#xff09;向下调整建堆的时间复杂度 4. 堆排序总结 二、TOP-K问题1. TOP-K问题背景2. TOP-K问题解决…

【日记】感觉自己已经魔怔了(817 字)

正文 下午装档案的时候&#xff0c;无意间朝外看了一眼&#xff0c;发现自己视力衰退了好多。感觉两只眼睛都有散光了&#xff0c;看东西有重影。有些担心。 兄长血检报告出来了&#xff0c;血红蛋白高&#xff0c;肌酐低。尿酸倒是正常了&#xff0c;但总体还是偏高。我觉得好…

408解题小助手—文心智能体

体验链接&#xff1a;408解题小助手 问题&#xff1a; 个字符有如下 种编码方案&#xff0c;不是前缀编码的是 A. 01 0000 0001 001 1 B. 011, 000, 001, 010, 1 C. 000, 001, 010, 011, 100 D. 0, 100, 110, 1110, 1100 回答&#xff1a; 不是前缀编码的是选项 D&#xff1a;0…

Java项目: 基于SpringBoot+mybatis+maven实现的智能推荐卫生健康系统分前后台(含源码+数据库+开题报告+任务书+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven实现的智能推荐卫生健康系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美…

C++ —— 关于list

目录 链接 前言 1. 迭代器浅解 2. 接口 2.1 构造函数 2.2 push_back 2.3 emplace_back 2.4 insert 2.5 erase 2.6 reverse 2.7 sort 2.8 merge 2.9 unique 2.10 splice 链接 cplusplus.com/reference/list/list/?kwlisthttps://cplusplus.com/reference/list/list…

MSF工具使用教程

Metasploit 简介 Metasploit 是一个漏洞框架&#xff0c;拥有超过 1700 个漏洞利用程序&#xff0c;大大简化了渗透测试的工作&#xff0c;同时具有模块化的体系结构&#xff0c;渗透测试人员可以很方便的添加或修改exploit。 安装及维护 安装 使用 Rapid7 的一套快速安装项…

js逆向--某建筑市场公共监管服务平台

js逆向--某建筑市场公共监管服务平台 一、抓包二、断点调试三、写代码一、抓包 很容易找到数据接口,发现响应加密了。 二、断点调试 打开源代码/来源界面,下一个XHR断点。 点击翻页,发现代码断住了。 发现到下图中的位置时,明文出现了。 点击上图中的图标进入b方法,找…

数据集-目标检测系列-自行车检测数据集 bike>> DataBall

数据集-目标检测系列-自行车检测数据集 >> DataBall 数据集-目标检测系列-自行车检测数据集 数据量&#xff1a;1W 数据项目地址&#xff1a; gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview github: https://github.com/TechLinkX/Data…

mybatisplus 分页查询 使用ORDER BY 时可能数据重复

原始方法&#xff1a; 第一页数据&#xff1a; 第二页数据&#xff1a; 解决方案&#xff1a; 后面在添加一个唯一键 id

2024年信息学奥赛CSP-J初赛真题详细分析

CSP-J 2024 入门组初赛第一轮初赛试题及答案解析 一、 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 1 32 位 int 类型的存储范围是&#xff08; &#xff09; A -2147483647 ~ 2147483647B -214…

OpenCV图像文件读写(1)检查 OpenCV 是否支持某种图像格式的读取功能函数haveImageReader()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 haveImageReader 函数通常用于检查 OpenCV 是否支持某种图像格式的读取功能。在 OpenCV 中&#xff0c;haveImageReader 函数可以帮助确定是否可…

【探索智谱AI的CogVideoX:视频生成的新前沿】

2024年8月6日&#xff0c;智谱AI宣布其开源视频生成模型CogVideoX&#xff0c;激发了开发者的创造力和对新技术的期待。 一、CogVideoX模型概述 CogVideoX 是一款先进的视频生成工具&#xff0c;可基于最长 226 个 token 的提示生成视频&#xff0c;时长可达 6 秒&#xff0c;…

美化网页,特效

当阅读博客园的文章时&#xff0c;经常看到精美的特效 博客园美化 - 凌云 - 博客园 (cnblogs.com) 简直不要太好看 自己写了一个前后端分离的网站后&#xff0c;想着应用这些特效&#xff0c;毕竟别人看到特效后逼格还是挺高的 于是&#xff0c;我F12把代码拿了下来 【手动狗…

算法记录——树

二叉树 3.1二叉树的最大深度 思路&#xff1a;二叉树的最大深度 根节点的最大高度。因此本题可以转换为求二叉树的最大高度。 而求高度的时候应该采用后序遍历。遍历顺序为&#xff1a;左右中。每次遍历的节点按后序遍历顺序&#xff0c;先收集左右孩子的最大高度&#xff0c;…

SpringBoot Validation不生效该怎么办?

SpringBoot Validation不生效该怎么办&#xff1f; 确认maven依赖查看依赖关系并处理验证&#xff1a;校验生效&#xff0c;成功反思 能问出这个问题说明你已经使用了Null、NotEmpty等等等校验注解&#xff0c;但是没有生效&#xff0c;我也出现过这种情况&#xff0c;请看我修…