crash原理-程序员宅基地

技术标签: 崩溃  bug  内存泄漏  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信号介绍

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_17347313/article/details/122784443

智能推荐

了解DSP的体系结构_怎么知道optisystem中dsp的组成-程序员宅基地

文章浏览阅读6.7k次,点赞3次,收藏22次。这篇其实基本上是引用 窦海霓, 朱铭锆发表在《今日电子》上的论文《DSP基本体系结构和特点》中的一些内容,主要是为了配合前一篇ARM体系结构而写,为了形成对比,加深印象。网络上很多引用这篇小论文的,但请尊重原著,注明出处。 一、DSP自身的一些优越性:DSP处理器的体系结构一直紧紧围绕着DSP算法和各种应用的不断发展而改进和优化,随着各种并行处理技术(VLIW,SIMD,超_怎么知道optisystem中dsp的组成

MPAndroidChart 饼图 数据过少时文字重叠_mpandroidchart 饼分图 重叠-程序员宅基地

文章浏览阅读1.2k次。MPAndroidChart 饼图 数据过少时文字重叠在使用MPAndroidChart这个控件来画饼图时,当有几个数据都是占比非常少的时候,伸出来的文字会重叠在一块。 这个坑花了比较多的时间填 。在网上找了一圈,都是复制的别人的文章。按照文章思路做了之后,还是会有重叠,而且有些时候线条很丑。这位大哥可能是原创的,有兴趣的可以点进去看下文章链接也有可能是我的使用姿势不对,始终没有达到我想要的效果。一番折腾后,决定自己动手改造。改造后的效果图基本思路是,找到绘制线条的类。PieChartR_mpandroidchart 饼分图 重叠

Windows系统重装Linux系统_本地window电脑改linux系统-程序员宅基地

文章浏览阅读6.4w次,点赞58次,收藏402次。PC机以前是Windows系统现在重装Linux系统材料: 8G以上U盘(eveything版本很大,如果U盘容量不足请选择DVD版本ISO) UltralSO Linux系统(Centos7_64_eveything.iso) tips:准..._本地window电脑改linux系统

FPGA开发技巧备忘录——Xilinx JTAG to AXI Master IP的使用_jtag2axi master-程序员宅基地

文章浏览阅读9k次,点赞12次,收藏51次。提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档FPGA开发技巧备忘录——Xilinx JTAG to AXI Master IP的使用前言用法Tcl指令展望前言无意间发现了JTAG to AXI Master IP核,发现这个东西对于FPGA单独调试应该比较有用,故而来研究了一番,发现这个东西切实很好用而且也比较简单。想起我之前为了构造一个指令系统专门写了一个UART2BUS,如果当时我知道使用JTAG to AXI Master IP核,那我肯定直接使用这个了,所以说真的是要._jtag2axi master

tls指纹之chrome新版功能/近期问题汇总/目前能直接使用的tls对抗库_chrome tls1.0设置-程序员宅基地

文章浏览阅读1.5k次。今天在找某个东西的时候,无意间,想看看ja3相关的东西,有没有啥值得研究的,然后就突然想起chrome随机指纹那个事,这个其实在2023年开年上班那几天的时候,就我群里看到群友说,chrome新版,自带随机ja3指纹,卧槽?我当时是不信的,结果试了半天,确实是不一样了????我用的以下网站测试,ja3官网现在经常无法访问了这是什么个情况?我反复确认,确实是不一样了,具体哪里不一样了呢?颠覆了啊,卧槽,为啥,ja3官网之前不是说一个浏览器客户端ja3指纹基本是固定的吗?_chrome tls1.0设置

开机所有网卡全部down掉解决方法,ens33 down_网卡down原因-程序员宅基地

文章浏览阅读4.9k次,点赞7次,收藏18次。一开机就发现所有网卡全部downifup ens33出现如下图:发现NetworkManager无效 难道是设备未托管?看了下配置文件和日志也没看出个所以然。。。。突然想到 难道是NetworkManager 和service冲突了?解决方法:ok,果然是细节决定成败,不多说了,容我哭去吧。。。。。。。。本解决方法纯属个人拙见,欢迎大佬扩展~..._网卡down原因

随便推点

node.js 常用命令_node命令-程序员宅基地

文章浏览阅读1w次,点赞26次,收藏50次。​​​​废话不多说,直接开干 基础命令,npm 的一些重要命令,拿到就是赚到,有赞必回_node命令

QT——(无规则)多边形图形填充。_qt drawpath填充不同颜色-程序员宅基地

文章浏览阅读3.4k次。this可以指向类内部非静态成员。path.lineTo();用循环的话不填充。将path的轨迹写出来的话,就有填充。_qt drawpath填充不同颜色

HCLA从基础到成熟-程序员宅基地

文章浏览阅读1.6k次,点赞47次,收藏21次。9.9-DHCP静态路由的设置:1.如何开始dhcp服务:首先进入二级命令,dhcp enable 开启dhcp服务,然后创建池塘:IP pool xx为池塘取个名字 一台设备上可以有多个池塘,但一个池塘只能服务一个广播域,network ---IP----mask 24绑定接口(此处绑定的接口为所要分配的IP范围),gateway该网段的网关地址(此处填写的IP地址为接口所在的网关地址),dns-list --ip --子网掩码(144.144.144.144),服务器地址,最后进入接口dhcp se

JVM工作原理与实战(三十八):JIT即时编译器原理_jvm 中的 jit 即时编译器-程序员宅基地

文章浏览阅读2.9k次,点赞114次,收藏46次。JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了JIT即时编译器、HotSpot中的JIT编译器、JIT优化技术、JIT优化建议等内容。_jvm 中的 jit 即时编译器

【mybatis plus源码解析】(一)mybatis plus执行原理,mybatis plus是如何实现自动注入CRUD操作_mybatisplus源码解析-程序员宅基地

文章浏览阅读9.6k次,点赞6次,收藏33次。【mybatis plus源码解析】(一)mybatis plus执行原理(二)详解SQL注入器底层原理,mybatis plus是如何实现自动注入CRUD操作mybatis plus源码解析。详解SQL注入器底层原理,mybatis plus是如何实现自动注入CRUD操作。通过源码看看相关类的详细解读。系列文章_mybatisplus源码解析

新货 升级版 BlackBerry手机条码扫描器 MS50,和BlackBerry 9900等手机可以完美结合_电影mm625-程序员宅基地

文章浏览阅读606次。新货 升级版 BlackBerry手机条码扫描器 MS50,和BlackBerry 9900等手机可以完美结合_电影mm625

推荐文章

热门文章

相关标签