APP运行时Crash自动修复+捕获系统 的设计初衷,就是为了降低app的crash率。...KVO机制在iOS的很多开发场景中都会被使用到。不过如果一不小心使用不当的话,会导致大量的crash问题。...由上可见多数由于KVO而导致的crash原因是由于被观察对象的KVO关系图混乱导致。那么如何来管理混乱的KVO关系呢。...所幸的是,苹果在iOS9之后专门针对于这种情况做了处理,所以在iOS9之后,即使开发者没有移除observer,Notification crash也不会再产生了。...不过针对于iOS9之前的用户,我们还是有必要做一下NSNotification Crash的防护的。
先上栈,这个 crash 是我们目前开发产品的 top5 crash ?...第一步 对于死在 ojbc _ msgSend 的函数(不仅仅是 msgSend, objc_retain 等一切没有创建栈帧的都需要注意),请先检查 crash 上报的寄存器信息 ?...目前的 crash上报功能,丢失了最顶层的栈。因为 objc_msgSend 并没有创建栈帧。 这样,我们就得根据 lr,来计算真实的最后一个栈了。 栈帧介绍 ?...crash 时 selector 存放在 x1 寄存器, 有时候上报平台会打印出 x-selector detect, 对比下 selector 是否一致,一致则说明上一步得到的地址没有问题) ----...但是如何修改呢?
对于致命的Bug,我们可以通过Crash日志进行分析;对于无法复现的Bug、特定操作步骤引起的Bug、某些版本/系统才出现的Bug,每个开发者都有自己的一套分析、定位、解决的方法。...只能把Bug总结为:iOS 11系统的手机在某些情况下会发生系统错误,导致整个手机的动画机制出现异常。 Bug出现之后,无法通过代码修复(iOS系统错误),只能重启手机。...Bug解决: 提示用户重启手机(可暂时修复); 向苹果提交Bug。...猜测、定位到问题所在之后,可以尝试修复,但是此Bug不在此列,不建议花费过多精力。 iOS 11 下拉刷新异常问题 功能背景: 在某些页面中,存在下拉刷新/上拉加载更多的功能。 ?...总结 iOS 11更新之后出现的问题比以往的版本更多,要求开发者需要投入更多的精力去适配,甚至会存在一些开发者无法修复的Bug。
1.将整个view截图返回image: 2.截取view的部分区域,返回image: 3.旧方法: 4.Tips 参考: 1.将整个view截图返回image: 这些 api 已被废弃,所以需要判断 iOS...创建绘图渲染格式 if #available(iOS 10.0, *) { let format = UIGraphicsImageRendererFormat()...已经被废弃了,用文章开头的 api 代替 4.Tips Tips1:得在加载到父视图 layout 后触发 Tips2:width 或 height 有一个为空 drawHierarchy 就会 crash...(就版iOS不会crash,新版会) 参考: drawViewHierarchyInRect:afterScreenUpdates: ios drawViewHierarchyInRect crash...EXC_BREAKPOINT UNKNOWN
—— 凯文·凯利 iOS App 有时可能遇到启动必 crash 的绝境:每次打开 App 都闪退,无法正常使用App。...为了尝试解决这个问题,微信读书开发了 iOS 连续闪退保护工具:GYBootingProtection,检测连续闪退,在连续闪退出现时,尝试自修复 App: ?...本文探讨了连续闪退问题的产生原因、检测、修复机制,以及如何在你的项目中引入、测试和使用 GYBootingProtection。...捕获 在念茜的漫谈 iOS Crash 收集框架一文中详细介绍了 Mach 异常和 Unix 信号捕获 crash 的机制。...如何检测 可以利用 PLCrashReporter 这类工具来检测连续闪退: 首先维护一个计数变量,表示连续闪退次数 在 PLCrashReporter 的 crash handler 中加入逻辑:如果启动
本文主要讲解两种野指针检测的原理及实现 技术点:野指针探测 本文的主要目的是理解野指针的形成过程以及如何去检测野指针 引子 在介绍野指针之前,首先说下目前的异常处理类型,附上苹果官网链接) 异常类型...iOS 默认是不启用的,所以我们一般不会遇到 EXC_EMULATION 执行打算用于支持仿真的指令 EXC_SOFTWARE 软件生成的异常,我们在 Crash 日志中一般不会看到这个类型,苹果的日志里会是...EXC_CRASH EXC_BREAKPOINT 跟踪或断点 EXC_SYSCALL UNIX 系统调用 EXC_MACH_SYSCALL Mach 系统调用 UNIX信号有以下几种 UNIX信号...我们一般在app发版前,都会经过多轮的自测、内侧、灰度测试等,按照常理来说,大部分的crash应该都被覆盖了,但是由于野指针的随机性,使得经常在测试时不会出现crash,而是在线上出现crash,这对app...野指针处理 iOS野指针定位:野指针嗅探器 iOS野指针定位总结 iOS Zombie Objects(僵尸对象)原理探索
—— 凯文·凯利 为了尝试解决这个问题,微信读书开发了 iOS 连续闪退保护工具:GYBootingProtection,检测连续闪退,在连续闪退出现时,尝试自修复 App: 本文探讨了连续闪退问题的产生原因...、检测、修复机制,以及如何在你的项目中引入、测试和使用 GYBootingProtection。...捕获 在念茜的漫谈 iOS Crash 收集框架一文中详细介绍了 Mach 异常和 Unix 信号捕获 crash 的机制。...简单来说,异常一般产生自 iOS 的微内核 Mach,然后在 BSD 层转换成 UNIX SIGABRT 信号,以标准 POSIX 信号的形式提供给用户。...如何检测 可以利用 PLCrashReporter 这类工具来检测连续闪退: 首先维护一个计数变量,表示连续闪退次数 在 PLCrashReporter 的 crash handler 中加入逻辑:如果启动
EXC_BREAKPOINT (SIGTRAP) 和 EXC_BAD_INSTRUCTION (SIGILL) 断点异常类型表示跟踪陷阱(trace trap)中断了该进程。...若想在自己代码中使用相同技术来处理不可恢复的错误,请调用 __builtin_trap() 函数,这将允许系统生成带有线程回溯的崩溃报告,表明代码如何达到不可恢复的错误。 ---- 2....有关使程序更高效运行,可参阅iOS Performance and Power Optimization with Instruments ---- 0xdead10cc 死锁 (dead lock)...EXC_CRASH(SIGQUIT) 应另一个进程的请求而终止 EXC_CRASH (信号退出) 表示进程应另一个有权管理其生命周期的进程的请求而终止。...如果 iOS 和 iPadOS 键盘扩展加载时间过长,主应用程序会终止键盘扩展。尽管与 watchdog 的异常信息不同,可参考:2.4.1. 0x8badf00d watchdog ---- 6.
当app发生crash时会产生crash report,这对我们定位crash的原因非常有帮助。这篇文档重点介绍了如何符号化、看懂并解析一篇crash Report。...所以你应当仔细研读这些crash report,去了解你的app究竟发生的是哪种crash,并尝试修复它们。 Crash Report,尤其是堆栈信息,在被符号化之前是不可读的。...获取Crash Report和Low Memory Report 如何调试已经部署好的iOS Apps讨论了如何从一个iOS设备直接拿到crash report和low memory report。...64位IOS用了zero-cost的异常实现机制。在zero-cost系统里,每一个函数都有一个额外的数据,它会描述如果一个异常在跨函数范围内实现,该如何展开相应的堆栈信息。...相关文档 如果想查看如何使用Zombies模板工具来修复内存释放的crash,可以查看Eradicating Zombies with the Zombies Trace Template 。
新机型的发布又会让适配相关的同学忙上一阵子啦,并且iOS Crash的问题始终伴随着移动开发者。本文将从三个阶段,由浅入深的介绍如何看懂并分析一篇crash报告,一起身临其境去读懂它吧。...所以你应当仔细研读这些crash report,去了解你的app究竟发生的是哪种crash,并尝试修复它们。 Crash Report,尤其是堆栈信息,在被符号化之前是不可读的。...获取Crash Report和Low Memory Report 如何调试已经部署好的iOS Apps讨论了如何从一个iOS设备直接拿到crash report和low memory report。...64位IOS用了zero-cost的异常实现机制。在zero-cost系统里,每一个函数都有一个额外的数据,它会描述如果一个异常在跨函数范围内实现,该如何展开相应的堆栈信息。...相关文档 如果想查看如何使用Zombies模板工具来修复内存释放的crash,可以查看Eradicating Zombies with the Zombies Trace Template 。
分析 用于Demo的是一个微信的Crash Log: WeChat-2018-6-11-21-54.crash 设备信息:iPhone 7,iOS 12 beta1 版本信息:微信 6.6.7.32 (...那么,问题就来了,最后的编译过程是你不可控的,那么如何获得dsym文件呢? 答案是Apple会生成这个dsym文件,你可以从XCode或者iTunesConnect下载。...crash的呢?...EXC_BREAKPOINT/SIGTRAP 和进程异常退出类似,但是这种异常在尝试告诉调试器发生了这种异常,如果当前没有调试器依附,那么则会导致进程被杀掉。...这种Crash在iOS底层的框架中经常出现,最常见的是GCD,比如dispatch_group Crashed: com.apple.main-thread 0 libdispatch.dylib
但是经过一段时间的时间后,发现这样带来的后果是当功能的粒度上如何做划分,是一个问题,有的功能模块比较大, 如果都放在一个里面就会造成过于臃肿的问题。...监控平台,不接不知道,一接吓一跳,接进去蜜蜂的 iOS Crash 率竟然到了 9%,是的是 9%。...除了算法上的不同,TalkingData 上还有一大波系统的 crash 并没有上报。 纠结完数字后,就开始了漫长了 Crash 治理,不知道有多少个日夜在梦里梦到怎样修复 Crash,也是醉醉的。...现在回头来看整个 iOS 异常治理整体的方法还是有迹可循的: ? 整个 iOS 修复的工程也是持续了一段时间,在这段时间我们不断的对问题进行尝试修复和验证,并将修复过程进行记录,方便以后查阅。 ?...经过一段时间的修复,iOS 的 Crash 率也终于降了下来,在这个过程中少不了 Native 同学的帮助。 ?
前言 分享iOS开发中遇到的问题,和相关的一些思考,本次内容包括:UIKit的iOS11问题、数据库问题定位、线上Crash处理、内存问题分析。...那么如何确定数据库是哪些表是瓶颈? 用户的数据库比较大,不可能进行整个数据库上传操作;而CoreData并不支持获取某个表的大小。...(不能通过行数直接判断数据库大小,因为表的列数不确定;也不能通过列大小*行数得到表体积,因为某些字段为空) 修复方案: 对瓶颈的表进行行数和体积双重控制; 对某些行数较多但表体积小的表建索引; 引用:...objc_msgSend 这类由UIKit引起的Crash通常是在回调业务层时,对应的target已经被释放,于是在objc_msgSend的时候就会发生Crash。 ?...故此猜测该问题苹果已经发现,并且在iOS 8后续的版本已经修复。 4、内存相关问题 实际场景涉及到业务,所以抽象成代码来进行分析。 场景1 下面这段代码是否能够正常运行?
正当大家都束手无策的时候,微信强大的技术团队针对这类Crash进行了深度研究,并提出了一个解决方案。原来微信也遇到了这个问题呢,我们一起来看看他们是如何干掉这个Crash的吧!...但在iOS 10发布之后,这类crash就嗖地窜到了微信的crash排行榜的前列,而此时微信并没有发布新版本。...按流程,我们向苹果提了bug report,并得到回复:“iOS 10.2 Beta有稳定性提升”。 终于等到iOS 10.2 Beta发布,我们重新统计了此类crash的系统版本分布。...(如果有同学知道如何绕过这个保护,烦请赐教。)...换句话说,苹果并不是修复了这个问题,而只是屏蔽了。因此其实我们在尝试一中提到替换dylib,即使替换成功,也是不解决问题的。
,迅速修复。...自动修复系统[4],也有一个对应开源框架JJException[5],也就是我们常说的安全气垫。...虽然没有 dSYM 文件时也有其他办法(可见详解没有 dSYM 文件 如何解析 iOS 崩溃日志[8])可以帮助我们将 Crash 抓出来,但是还是不如有 dSYM 文件时来的简单快捷。...iOS 符号解析重构之路 iOS 符号化:基础与进阶 iOS 崩溃日志在线符号化实践 漫谈 iOS Crash 收集框架[16] iOS Crash 分析:符号化系统库方法[17] 聊聊从 iOS 固件提取系统库符号...APP 运行时 Crash 自动修复系统: https://neyoufan.github.io/2017/01/13/ios/BayMax_HTSafetyGuard/ [5]JJException
背景 分享一些过去两个月遇到的crash。...根据堆栈信息和日志信息,可以找到用户操作路径,是通过scheme进入分类; 但是直接用真机复现,相同的操作并不会导致crash; 通过分析crash出现的机型和系统特征,发现都是iOS 13以下系统...,而刚刚尝试的是iOS 13的真机; 于是用iOS 12模拟器尝试同样的路径,可以成功复现。...修复方式 ?...修复方法: 1、block访问到的外部对象,非局部变量尽可能使用weak-strong的方式来声明;用weak指针来声明外部的变量,如果该对象在block回调前被释放,则会变为nil; 2、如果需要
更低的Crash率不但能让产品获得更好的用户口碑,在整个流程中也能让团队成员获得更多的成长,加深对iOS系统底层的理解,为今后的开发带了更大的帮助。 ?...App也缺乏相关的防护或者是容错处理,Crash率瞬间飙升,重新发版又要走发布流程,只能依赖FB后台的修复,当时束手无策十分被动,所以决定自己做一套较为完整的Crash防护体系,来避免这样的场景再次发生...在iOS系统中基本可以总结出这四个步骤, Crash防护 - 通过Hook等手段,对一些类似容器类进行入参校验等措施,来进来避免Crash的发生 Crash拦截 - 如果第一步防护失败,那么在Crash...Crash后续流程 - Crash发生后如何做才能最大限度的保护用户体验,如何优雅的Crash II:Crash防护 Crash防护方式主要分两种:针对非内存问题通常采用AOP方式,内存问题采用zombie...内存阈值的确定便成了关键,这里会遇到两个问题: 1:内存问题一定会和机型强相关,如何根据不同的机型调整不同的阈值? 2:如何做到根据线上情况灵活动态调整?
iOS11键盘问题 功能背景: 弹出键盘时,如果有输入框的话,需要输入框的位置跟随键盘大小而变动。...问题修复: 输入框增高,增加上图左边红框部分的高度; 和键盘对齐的时候,往下计算红框的高度。...附: iOS 11还有另外的键盘表现异常:在APP中呼起键盘,把APP切入后台,在系统桌面下滑呼起系统搜索的键盘,会导致APP内的键盘收起。...问题修复: 修复方案,可以是dispatch到下一个runloop再执行reloadData,这样在4.5回调中调用visiableCell的时候visiableCell拿到上一次的cell,这样链路会断开...Crash定位 源于实际开发中遇到的一个Crash问题,类似堆栈如下: ? crash问题在各个iOS版本均有出现,每天的crash率(crash次数/用户数)在万分之1.5左右。
但在iOS 10发布之后,这类crash就嗖地窜到了微信的crash排行榜的前列,而此时微信并没有发布新版本。...按流程,我们向苹果提了bug report,并得到回复:“iOS 10.2 Beta有稳定性提升”。 终于等到iOS 10.2 Beta发布,我们重新统计了此类crash的系统版本分布。...如果不搞清楚触发crash的原因,那这将是一颗定时炸弹,不知道何时就会被我们合入主线,发布出去。因此我们着手开始做一些尝试。 尝试 首先我们的切入点是iOS 9和10.2 Beta没有crash。...(如果有同学知道如何绕过这个保护,烦请赐教。)...换句话说,苹果并不是修复了这个问题,而只是屏蔽了。因此其实我们在尝试一中提到替换dylib,即使替换成功,也是不解决问题的。
领取专属 10元无门槛券
手把手带您无忧上云