crash原理

前言

在开发中,经常发生程序异常崩溃,我们一般的处理是通过找到类似crashdump日志文件,找到原因。本文就是研究crash的原理。


一、虚拟内存

  1. 为什么需要虚拟内存

虚拟存储器是存储管理的核心概念。现代计算机系统的物理存储器都分为内存和外存,其理由是内存价格昂贵,不可能用大容量的内存存储所有被访问的或不被访间的程序与数据段。而外存尽管访问速度较慢,但价格便宜适合存放大量信息。实验证明,在一个进程的执行过程中,其大部分程序和数据并不经常被访问。这样,存储管理系统把进程中那此不经常被访问的程序段和数据放人外存中,待需要访问它们时再将它们调人内存。那么,对于那些一部分数据和程序段在内存而另一部分在外存的进程,怎样安排它们的地址呢?

通常由用户编写的源程序,首先要由编译程序编译成CPU可执行的目标代码。然后。链接程序把一个进程的不同程序段链接起来以完成所要求的功能。显然,对于不同的程序段,应具有不同的地址。有两种方法安排这些编译后的目标代码的地址。一种方法是按照物理存储器中的位置赋予实际物理地址。这种方法的好处是CPU执行目标代码时的执行速度高。但是,由于物理存储器的容量限制,能装人内存并发执行的进程数将会大大减少,对于某些较大的进程来说,当其所要求的总内存容量超过内存容量时将会无法执行。另外。由于编译程序必须知道内存的当前空闲部分及其地址,并且把一个进程的不同程序段连续地存放起来,因此编译程序将非常复杂。

另一种方法是编译链接程序把用户源程序编译后链接到一个以0地址为始地址的线性或多维虚拟地址空间。这里,随接既可以是在程序执行以前由链接程序完成的静态链接,也可以是在程序执行过程中由于需要而进行的动态链接。而且,每一个进程都拥有这样一个空间(这个空间是一维的还是多维的由存储管理方式决定)。每个指令或数据单元都在这个虚拟空间中拥有确定的地址,这个地址称为虚拟地址(virtualaddress)。

  1. 动态地址重定位:

动态地址重定位(dynamic address relocation)是在程序执行过程中,在CPU访问内存之前,将要访问的程序或数据地址转换成内存地址。动态重定位依靠硬件地址变换机构完成。
地址重定位机构需要一个(或多个)基地址寄存器BR和一个(多)程序虚拟地址寄存器VR。指令或数据的内存迪址MA与虚拟地址的关系为
MA = (BR) + (VR)
在这里插入图片描述

  1. 内存信息的共享与保护:

在多道程序设计环境下,内存中的许多用户程序或系统程序和数据段可供不同的用户进程共享。这种资源共享将会提高内存的利用率、但是反过来说除了被允许共享的部分之外,又要限制各进程只在自己的存储区活动各进程不能时别的进程的程序和数据段产生干扰和破坏,因此必须对内存中的程序和数据段采取保护措施。
常用的内存信息保护方法有硬件法、软件法和软硬件结合法3种。

  • 上下界保护法:
    是一种常用的硬件保护法。上下界存储保护技术要求为每个进程设置一对上下界寄存器其中装有被保护程序和数据段的起始地址和终止地址。在程序执行过程中在对内存进行访问操作时首先进行访址合法性检查,在范围内则合法,否则非法,并产生一个越界中断。

  • 保护键法:
    保护键法为每一个被保护存储块分配一个单独的保护键。在程序状态字中则设置相应的保护键开关字,对不同的进程赋予不同的开关代码与被保护的存储块中的保护键匹配。保护键可设置成对读写同时保护,也可以设置成只对读或写进行单项保护。例如,下图中的保护键0就是对2K到4K的存储区进行读写同时保护,而保护键2则只对4K到6K的存储区进行写保护。如果开关字与保护键匹配或存储块未受到保护,则访问该存储块是允许的,否则将产生访问出错中断。
    在这里插入图片描述

  • 另外一种常用的内存保护方式是界限寄存器与CPU的用户态或核心态工作方式相结合的保护方式。在这种保护方式下,用户态进程只能访问那些在界限寄存器所规定范围内的内存部分,而核心态进程则可以访问整个内存地址空间。UNIX系统就是采用的这种内存保护方式。

  1. 用户态与内核态的空间

在内存资源上的使用,操作系统对用户态与内核态做了限制,每个进程创建都会分配「虚拟空间地址」,以Linux32位操作系统为例,它的寻址空间范围是 4G(2的32次方),而操作系统会把虚拟控制地址划分为两部分,一部分为内核空间,另一部分为用户空间,高位的 1G(从虚拟地址 0xC0000000 到 0xFFFFFFFF)由内核使用,而低位的 3G(从虚拟地址 0x00000000 到 0xBFFFFFFF)由各个进程使用。
在这里插入图片描述

用户态:只能操作 0-3G 范围的低位虚拟空间地址
内核态:0-4G 范围的虚拟空间地址都可以操作,尤其是对 3-4G 范围的高位虚拟空间地址必须由内核态去操作
补充:3G-4G 部分大家是共享的(指所有进程的内核态逻辑地址是共享同一块内存地址),是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据
每个进程的 4G 虚拟空间地址,高位 1G 都是一样的,即内核空间。只有剩余的 3G 才归进程自己使用,换句话说就是, 高位 1G 的内核空间是被所有进程共享的!

二、中断与异常

中断 是指在程序执行过程中,出现某种紧急事件,CPU暂停执行现行程序,转去执行处理该事件的程序——中断服务程序,执行完后再返回到被暂停的程序继续执行,这一过程称为中断。
异常 是当 CPU 在执行用户态的进程时,由于执行了现行指令,发生了一些没有预知的异常。
相同点 都是CPU对系统发生的某个事情做出的一种反应。
区别 中断则是由于系统中某事件引起的,该事件与现行指令无关。异常由CPU本身指令引起。

三、crash的过程:

1.内存不够用了,操作系统会杀掉进程,这类属于被动的,
2.CPU占用太高,操作系统也会杀掉进程,这类也属于被动的,
3.主动的,以数组越界为例,当访问数组时,使用越界index,对内存进行访问操作时首先进行访址合法性检查,如果用户有定义异常捕获处理程序,则在CPU发生异常时,都会将控制权从异常前的程序交给异常处理程序。如果没有,则会由操作系统捕获,产生一个中断,而且CPU将获得 不会更低 的执行权利,比如执行用户态的应用程序发生异常,CPU将切换到内核态,并执行对应的异常处理程序。默认产生一个crash signal,然后到对应的handle处理,并产生一个类似crashdump的日志。最后杀掉进程,释放进程资源。

四、crash怎么解决:

1.第一优先级,看手机型号,常见的老的手机,内存小的手机,可能本身需要的内存或者CPU主频频率低,就可能导致占用过高闪退,这种的一般都是长期优化的目标。
2.安装包的类型,一般有日志包,性能包,发布包,还有一些其他的设置,可能有的时候mono的GC不开,或者日志量特别大,导致闪退,需要进行排除。
3.可以复现的问题,可以使用windows debug复现,一般会直接抛出问题,或者异常。
4.根据生成的crash日志文件找到相应的错误,通常错误信息里记录了错误的大致位置,据此可以捕获到问题的关键信息。平台差异如下:

1.windows

生成目录:
Windows C:\Users\username\AppData\LocalLow\CompanyName\ProductName\Player.log
Windows C:\Users\username\AppData\LocalLow\CompanyName\ProductName\output_log.txt
方法:
打开直接看最后的日志信息

2.android

android 保存日志的位置:

  • 手机的默认的日志目录:
  • /data/local/tmp/*
  • /data/tmp/*
  • /data/system/usagestats/*
  • /data/system/appusagestates/*
  • /data/system/dropbox/*
  • /data/tombstones/*
  • /data/anr/*
  • logcat的日志在/dev/log/main
  1. 可以通过android studio logcat查看
  2. adb可以通过adb logcat 相关命令抓取日志
  3. 通过adb pull 获取上述路径手机日志

3.ios

日志导出参考:OS上获取崩溃日志的N+1种方法
Signal:iOS中Mach异常和signal信号介绍

五、腾讯bugly

腾讯bugly官网

  1. 通过腾讯bugly文档接入bugly
  2. bugly配置
  3. 生成并上传符号表
  4. 通过bugly获取异常上报日志,据说快要升级了,会很好用,可以期待一下

六、总结

这次大体研究了一下crash dump的原理,以及各个平台crash日志产生与获取的方法,后续会就每个专题进行深入的学习与研究。

七、引用

从根上理解用户态与内核态
android 系统 log存放路径
OS上获取崩溃日志的N+1种方法
iOS中Mach异常和signal信号介绍

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值