Swift app中的Crash捕获与处理

1. 为什么会Crash

常见的Crash原因有:访问已经被释放的内存,数组越界,使用!解包值为nil的变量。当遇到这些情况时,说明应用已经遇到了很严重的非预期错误,无法再继续运行。操作系统检测到这些非法操作时会向应用发送对应的信号,而应用对这些信号的默认处理是直接让应用退出(已信号值作为退出码)。这样就出现了我们看到的Crash,闪退。

具体的信号种类和信号机制见Unix Signal

2. 如何捕获和处理Crash

在swift3.0中,我们可以通过如下调用来注册对特定信号的处理逻辑。

signal(SIGINT, {s in print(s);})

在处理函数中我们一般做如下操作:

  • 获取调用栈信息
  • 相关逻辑处理(比如保存调用栈到文件或数据库)
  • 恢复信号处理函数到默认设置
  • 调用exit退出应用

3. 获取调用栈信息

分析Crash最有价值的信息就是调用栈。在Swift 3.0中我们可以调用Thread.callStackSymbols来获取Crash的调用栈信息。(以前是通过backtrace和backtrace_symbols系统调用来获取)

需要说明的是Thread.callStackSymbols返回的调用栈也包含了从crash触发代码到调用Thread.callStackSymbols之间的调用栈信息,可根据需要选择是否去除。

基于以上技术点,我分别基于OC和Swift实现了两套CrashHandler,以及示例程序。代码见:https://github.com/lbwxly/CrashHandler

时间: 2025-01-13 14:59:07

Swift app中的Crash捕获与处理的相关文章

Swift语言中的泛型编程 【Generic】【Part 1】

泛型  泛型编程让你可以编写更具扩展性.易重用的功能,代码使用时的类型取决于你所定义的业务需求.你可以编写避免重复的代码,目标更加清晰明确,风格抽象. 泛型是Swift语言的一项强大的特性,基本上所有的swift标准库都建立在泛型代码上.实际上,你在这本书的时候不知不觉地接触到泛型,它贯穿始终.例如Swift的数组和字典类型都是泛型集合.你可以创建用于存放整数值的数组,也创建数组存储字符串,其他所有能在Swift中创建的类型都可以创建到数组中.类似的,你可以创建字典来存储数值或其他指定的类型,毫

iOS:项目中疑难Crash问题集锦

项目中疑难Crash问题集锦 iOS App运行中遇到Crash的情况相信大家都遇到过,开发和者测试中遇到了可能很方便的办法就是直接拿着设备连接一下,然后使用Xcode自带的工具就可以解析出Crash地址了.对于线上App运行时的Crash收集也有很多好用的第三方工具,具有代表性的就是Crashlytics,通过打包时上传dSYM文件,收集到的Crash就可以解析为可读的格式了. 尽管Crashlytics功能已经很强大了,统计出来的Crash信息也足够详细,还是会有一些难缠的问题,例如程序直接

在 Swift 项目中实现侧滑菜单-利用 SWRevealViewController

你可以完全自己手动写一个侧滑菜单,但是现在在 GitHub 上面已经有很多免费的开源库了,如果不是有很特别的需求,大可不必新建一个轮子. 在这里我使用的这个第三方库名字叫做 SWRevealViewController,作者是 John Lluch.这个免费的类库提供了很方便快捷的方法去把侧滑菜单加入到你的 App 里面,而且它还提供了很多个性化的设置项.它是用 Objective-C 来写的,但是我们也可以很方便的在 Swift 项目中去使用它.你分分钟便可学会如何使用. 首先来看一下我们的

如何在 iOS App 中整合 Facebook 廣告

原文:Displaying Facebook Ads in Your iOS Apps 作者:GABRIEL THEODOROPOULOS 译者:kmyhy 不久前有人問我如何在項目中集成 Facebook 的廣告.因為之前沒用過,以為一定很難,所以事先查閱了大量文檔.在通讀完文檔之後,發現其實並不是很難,僅僅幾分鐘我就能夠搞定我的第一個 Facebook 廣告 App! Facebook 廣告是一種將廣告集成到你的 app 中的方法,使你可以通過廣告的點擊量來獲得收入.這個方法(集成廣告)并不

Xcode7.3工具解析App崩溃日志(.crash文件)

Xcode7.3工具解析App崩溃日志(.crash文件) 原文链接:http://blog.csdn.net/u011056605 开发的App或者游戏提交审核后,偶尔会收到测试反馈的消息,说应用崩溃了,bug偶尔出现,难以找到确定的重现方法. 怎么办?可以分析崩溃文件啊,也就是app崩溃后,自动保存在设备本地的.crash文件. 获得崩溃日志的方式,在 获取设备上的调试信息与崩溃日志分析 中有说. 在环境ok的情况下,xcode中是可以自动解析.crash文件的.旧版本的xcode甚至可以导

Swift 3 中的新特性

原文:What's New in Swift 3? 作者:Ben Morrow 译者:kmyhy Swift 3 将在下半年退出,对于 Swift 程序员来说,它带来了许多改变. 如果你没有密切关注 Swift Evolution 项目,那么在将代码迁移到 Swift 3 时,你可能不知道它到底有什么改变,以及它会对你的代码带来什么影响.那么你可能需要读一下这篇文章了. 通过本文,我将重点介绍 Swift 3 中的重大改变,这些改变对你的代码有深刻影响.让我们开始吧! 开始 目前,Swift 3

Swift语言中如何使用JSON数据教程

原文:Swift语言中如何使用JSON数据教程 这是一篇翻译文章,原文出处:http://www.raywenderlich.com/82706/working-with-json-in-swift-tutorial JSON(全称:JavaScript Object Notation),是网络服务中传输数据的常用方法,JSON因为容易使用,且可读性强, 所以非常受到欢迎. 下面是个JSON的一个片段: [ {"person": {"name":"Dani

【IOS】App中OAuth授权的实现方式

OAuth 授权在 iOS 中的实现方式 在 iOS App 中,需要绑定微博.twitter.flickr 等第三方平台账号时,一般用OAuth 授权的方式. OAuth 1.0 授权大致分为以下三步: 客户端向平台申请一个 request token,该 token 是未授权的: 客户端打开平台提供的登陆页面,引导用户输入用户名密码,对 request token 进行授权. 登陆页面的 url 中会附带一个 redirect_url,当授权成功后会重定向到这个地址,返回客户端. 客户端拿着

JSPatch来更新已上线的App中出现的BUG(超级详细)

JSPatch来更新已上线的App中出现的BUG(超级详细) 字数2858 阅读422 评论15 喜欢29 JSPatch的作用是什么呢? 简单来说:(后面有具体的操作步骤以及在操作过程中会出现的错误) 1.iOS应用程序上架到AppStore需要等待苹果公司的审核,一般审核时间需要1到2周.虽然程序在上架前会经过测试人员的测试,但有时候还是不免会发生新版本上线后出现严重的bug,导致用户刚升级到新版本就出现crash,严重影响用户体验. 2.这时能做的只是赶紧修复bug然后提交等待漫长的App