应用稳定性优化2:Crash/Tombstone问题分析及定位

1. Crash/Tombstone问题原因分析

在这里插入图片描述

2. Tombstone问题定位方法

本节主要讲解Tombstone问题的分析定位方法。

2.1 信号量分析法

信号机制是进程之间相互传递消息的一种方法,下表展示的是一些常见的信号种类。
在这里插入图片描述

SIGBUS与SIGSEGV的区别

SIGBUS(Bus error)意味着指针所对应的地址是有效地址,但总线不能正常使用该指针。通常是未对齐的数据访问所致。比如int型要4字节对齐,short型的2字节对齐。例如:short array[16];int * p = (int *)&array[1];*p = 1;SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。例如:int pi= (int)0x00001111;*pi = 17。

2.2 反编译调用栈法

反编译调用栈步骤
在这里插入图片描述

  1. 新建一个tombstone.txt,把backtrace里面的内容写入到txt里面去;
  2. 执行脚本 ./panic.py tombstone.txt>log.txt;
  3. 更细致的调用栈可以参考stack里面的纪录;
  4. 打开log.txt之后,分析函数的调用栈,从调用栈找出逻辑关系。

虚拟机调用流程

反编译了调用栈之后,一般中间都有很多的虚拟机调用,这部分的顺序一般都是相同的,了解这些虚拟机函数,也有助于我们分析问题。下图是主要的虚拟机函数:
在这里插入图片描述

案例分析

进入某应用就崩溃,调用栈如下:
在这里插入图片描述
在这里插入图片描述

分析上方调用栈发现,因为调用dvmInterpret方法,表明启动Dalvik虚拟机解释器,并且解释执行指定的JAVA代码。
在这里插入图片描述

通过分析上方调用栈可以看到,因为调用dvmCallJNIMethod方法,表明是在native侧触发错误。

接着往下看,真正的原因在下方调用栈:
在这里插入图片描述

一个JAVA方法通过JNI调用底层方法时,传入一个非法的String,JNI在把这个String转换成char数组时导致失败。

2.3 地址分析法

Linux程序在运行时,会将所有用到的模块加载到内存,所有的段分布到统一的虚拟内存空间中,程序调用过程中的地址都是内存空间的虚拟地址,我们只知道该位置位于哪个模块,却不知道具体哪个函数出了问题。而地址的确对应了一个函数,因此只有知道了模块在内存中的分布情况,才能找到对应偏移位置的函数。

取得进程pid的内存分布

问题发生时,都会打印出当前的进程号。假如进程号为2429,命令如下(需要root) : adbshell cat /proc/2429/maps>2429.txt,然后我们把fault addr, stack地址放到2429.txt里面查找。一般fault addr在栈区,是栈溢出;在堆区,一般是数组越界或者内存被踩;在代码区,一般是函数指针跑飞了。

maps地址解析

其中,[stack]表示代表栈区;(deleted)表示堆区,内存可回收;一些.so,.jar,.dex,.apk表示代码区。

深入分析栈地址

backtrace和stack:里面都是栈的调用信息。backtrace里面地址我们可以用脚本panic.py去反编译。那stack:里面的地址如何分析呢?stack里面的地址是等于基地址+偏移地址,可以借用工具arm-linux-androideabi-objdump。Objdump一下libandroid_runtime.so,如下:
在这里插入图片描述

可以看到各个对应的偏移地址的函数。

操作步骤

  1. 取出stack里面的地址
  2. 通过前面输出的该进程的内存分布图,分析该地址属于哪一个.so
  3. 把该栈地址减去对应.so的基地址,就是偏移地址
  4. 把该偏移地址,放到objdump反编译的文件里面找,就能找到对应的方法

学习自:https://cloud.tencent.com/developer/article/1969660

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Javaweb之SpringBootWeb案例之自动配置的两种常见方案的详细解析

3.2.2.2 方案一 ComponentScan组件扫描 SpringBootApplication ComponentScan({"com.itheima","com.example"}) //指定要扫描的包 public class SpringbootWebConfig2Application {public static void main(String[] args) {SpringApplication.run(Sprin…

【贪心算法】121. 买卖股票的最佳时机 I Leetcode 122. 买卖股票的最佳时机 II

【贪心算法】121. 买卖股票的最佳时机 I Leetcode 122. 买卖股票的最佳时机 II 121. 买卖股票的最佳时机 I贪心算法:遍历每一天卖出金额,一边计算卖出金额减之前的最小值,一边更新该卖出day前的最小金额 122. 买卖股票的最佳时机 II贪心算法…

Springboot+vue的商业辅助决策系统的设计与实现(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的商业辅助决策系统的设计与实现(有报告)。Javaee项目,springboot vue前后端分离项目 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的商业辅助决策系统的设计与实现,采…

C++ //练习 10.17 重写10.3.1节练习10.12(第345页)的程序,在对sort的调用中使用lambda来代替函数compareIsbn。

C Primer(第5版) 练习 10.17 练习 10.17 重写10.3.1节练习10.12(第345页)的程序,在对sort的调用中使用lambda来代替函数compareIsbn。 环境:Linux Ubuntu(云服务器) 工具&#xf…

数据库原理(一)

1、基本概念 学号姓名性别出生年月籍贯220101张三男2003江苏220102李四男2003山东220103王五女2003河北220104赵六女2003天津220105张四男2003北京220106李五女2003江苏220107王六女2003山东220108张七男2003河北220109张九男2003天津220110李十女2003北京 1.1数据&#xff0…

《系统架构设计师教程(第2版)》第5章-软件工程基础知识-05-净室软件工程(CSE)

文章目录 1. 概述2. 理论基础2.1 函数理论2.2 抽样理论 3. 技术手段3.1 增量式开发3.2 基于函数的规范与设计3.3 正确性验证3.4 统计测试 (Statistically Based Testing) 和软件认证 4. 应用与缺点1)太理论化2)缺少传统模块测试3)带有传统软件…

频率域采样

1. 频率域采样 (1) 采样的过程:DFT的X(k)是对周期且连续的频谱X()在[0,2pi)上的等间隔采样,采N个点得到的,采样间隔是;频域采样要求时域有限,即假设x(n)的长度是有限值M,x(n)的SFT是X()。 (2) X(k) 做IDF…

YOLOv9有效提点|加入BiFormer、SEA、EMA、Efficient se等几十种注意力机制(三)

专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,主力高效涨点!!! 一、本文介绍 本文只有代码及注意力模块简介,YOLOv9中的添加教程:可以看这篇文章。 YOLOv9有效提点|加入SE、CBAM、ECA、SimA…

svn介绍 4.0

一、svn介绍(版本控制工具) 1、svn的定义: svn是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式个管…

全球十大正规伦敦金交易平台app软件最新排名(综合版)

伦敦金作为当前国际市场中较为成熟、灵活的投资产品自然备受青睐,但投资者在选择交易软件时,应该尽量选择在行业内排名较高,口碑较好的平台,这样才能获得可靠的投资服务。刚开始不太懂得如何选择伦敦金软件的时候,投资…

Carla自动驾驶仿真九:车辆变道路径规划

文章目录 前言一、关键函数二、完整代码效果 前言 本文介绍一种在carla中比较简单的变道路径规划方法,主要核心是调用carla的GlobalRoutePlanner模块和PID控制模块实现变道,大体的框架如下图所示。 一、关键函数 1、get_spawn_point(),该函数根据指定r…

如何查看docker容器里面运行的nginx的配置文件哪

要查看Docker容器内运行的Nginx配置文件的位置,你可以通过进入容器的shell环境来直接查看。Nginx的默认配置文件通常位于/etc/nginx/nginx.conf,而网站特定的配置文件通常位于/etc/nginx/conf.d/目录中。以下是步骤来查看这些配置文件: 步骤…

【嵌入式学习】网络编程day0229

一、思维导图 二、练习 TCP通信 服务器 #include <myhead.h> #define SER_IP "192.168.126.42" #define SER_PORT 8888 int main(int argc, const char *argv[]) {int wfd-1;//创建套接字if((wfdsocket(AF_INET,SOCK_STREAM,0))-1){perror("error"…

基于CNN-LSTM-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 长短时记忆网络&#xff08;LSTM&#xff09;处理序列依赖关系 4.3 注意力机制&#xff08;Attention&#xff09; 5…

探索数据结构:深入了解顺序表的奥秘

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 什么是顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元…

迪杰斯特拉算法的具体应用

fill与memset的区别介绍 例一 #include <iostream> #include <algorithm> using namespace std; const int maxn500; const int INF1000000000; bool isin[maxn]{false}; int G[maxn][maxn]; int path[maxn],rescue[maxn],num[maxn]; int weight[maxn]; int cityn…

011 Linux_线程概念与创建

前言 本文将会向你介绍线程的概念&#xff0c;以及线程是怎么被创建的 线程概念 一、进程是承担系统资源的基本实体&#xff0c;线程是cpu调度的基本单位 首先&#xff0c;地址空间在逻辑上相当于进程的资源窗口&#xff0c; 每个进程都有这样一个资源窗口。通过地址空间页…

《热辣滚烫》:用坚持不懈开启逆境中的职场出路

"你只活一次&#xff0c;所以被嘲笑也没有关系&#xff0c;想哭也没有关系&#xff0c;失败更没有关系。" “人生就像一场拳击赛&#xff0c;你站不起来&#xff0c;就永远不知道自己有多强” “命运只负责洗牌&#xff0c;出牌的永远是自己。” 在今年的贺岁档电影市…

MySQL的21个SQL经验

1. 写完SQL先explain查看执行计划(SQL性能优化) 日常开发写SQL的时候,尽量养成这个好习惯呀:写完SQL后,用explain分析一下,尤其注意走不走索引。 explain select userid,name,age from user where userid =10086 or age =18;2、操作delete或者update语句,加个limit(S…

C++之stack

1、stack简介 stack是实现的一个先进后出&#xff0c;后进先出的容器。它只有一个出口&#xff0c;只能操作最顶端元素。 2、stack库函数 &#xff08;1&#xff09;push() //向栈压入一个元素 &#xff08;2&#xff09;pop() //移除栈顶元素 &#xff08;3…