iOS崩溃之dispatch_async

问题

先直接上堆栈

一看到这种堆栈就头痛,但最近正好在学习Apple源码阅读,所以还是静下心来仔细分析。

从堆栈来看,crash的原因应该就是objc_terminate 被调用了。再看是***_dispatch_client_callout*** 调用的,该方法常出现在dispatch_async中,被RunLoop调用,所属的库是libdispatch.dylib。

Apple Open Source下载libdispatch,搜索***_dispatch_client_callout***

复制代码
#undef _dispatch_client_callout
void
_dispatch_client_callout(void *ctxt, dispatch_function_t f)
{
	@try {
		return f(ctxt);
	}
	@catch (...) {
		objc_terminate();
	}
}

这里f 应该就是dispatch_async 传过去的block,底下的objc_terminate很明显就是造成崩溃的直接原因。

而这里被try-catch包裹,那么崩溃的原因已经很明显了,block方法里抛出异常被捕获,触发***objc_terminate(),***造成崩溃。

解决

那么问题来了,如何确定是哪里抛出的异常呢?

首先,常用的NSSetUncaughtExceptionHandler肯定是没法用了,因为这是捕获了异常,主动结束程序。

我们需要的是在异常抛出的那个瞬间,获得当前的堆栈信息。突然想到了,可以使用Xcode提供的Exception Breakpoint。

当我这样设置好断点,满心欢喜地等待结果时,发现又不行。因为应用程序里有太多抛异常的地方了.....一卡一卡地,根本没法运行下去。要是可以跳过断点,并且打印堆栈就好了~

等等,好像这里就提供了这样的功能。我看了看下面的英文,尝试了一下。

可以!!每个抛异常的地方都打印出当前的堆栈,并且跳过。接着触发crash,找到最后打印的堆栈。

这里也可以用lldb命令来实现

相关推荐
Swift社区8 小时前
iOS 基于 Foundation Model 构建媒体流
ios·iphone·swift·媒体
上去我就QWER10 小时前
macOS下如何全文检索epub格式文件?
macos
库奇噜啦呼10 小时前
【iOS】音频与视频播放
ios·音视频·cocoa
谢娘蓝桥11 小时前
Mac 安装 Xcode 及qt 环境安装
ide·macos·xcode
witton14 小时前
克隆整个macOS系统到新磁盘
macos·asr·克隆·复制·迁移·恢复·restore
csdn_aspnet16 小时前
如何在 Mac、Ubuntu、CentOS、Windows 上安装 MySQL 客户端
linux·windows·mysql·macos·centos
我的golang之路果然有问题16 小时前
mac M系列芯片 unity 安装会遇到的错误以及解决
经验分享·学习·macos·unity·游戏引擎
大熊猫侯佩18 小时前
黑衣人档案:用 Apple Foundation Models + SwiftUI 打造 AI 聊天机器人全攻略
ios·swiftui·ai编程
大熊猫侯佩18 小时前
侠客行・iOS 26 Liquid Glass TabBar 破阵记
ios·swiftui·swift
心灵宝贝18 小时前
如何安装 PDF Reader Pro for Mac v3.2.1.0?超简单DMG安装步骤(附安装包)
macos