KSCrash 是业界知名的 Crash 收集框架,其功能想必不用过多介绍。本系列笔记主要是想搞清楚这个框架是如何使用的、如何捕获到崩溃的、如何收集崩溃的。
使用示例
1 | - (void) installCrashHandler |
这是 KSCrash 官方提供的示例代码,支持通过 url、email 等方法上报日志。
注册篇
从上一整节使用示例里也能看到,KSCrash 的注册关键在于 [installation install];
这行方法,进行注册后才能进行 Crash 的捕获。该方法的具体内容:
1 | - (void) install |
上述方法又调用了 KSCrash 类的 install
方法,该方法的具体内容:
1 | - (BOOL) install |
上述方法又调用了 kscrash_install
方法,该方法的具体内容:
1 | KSCrashMonitorType kscrash_install(const char* appName, const char* const installPath) |
其中,调用了关键方法 kscm_setEventCallback
和 kscrash_setMonitoring
。
kscm_setEventCallback
kscm_setEventCallback
方法用于将的入参为 onCrash
回调方法保存起来,在捕获到 Crash 之后进行统一调用。
onCrash
方法很关键,后期捕获到各种类型的 Crash 后都会调用这个方法。这里先贴下代码,后边在捕获到 Crash 之后的流程里再具体分析。
1 | static void onCrash(struct KSCrash_MonitorContext* monitorContext) |
我们来看下 kscm_setEventCallback
方法的具体内容
1 | void kscm_setEventCallback(void (*onEvent)(struct KSCrash_MonitorContext* monitorContext)) |
kscm_setEventCallback
方法只是把传入的 onCrash
方法赋值给了 g_onExceptionEvent
全局变量。尝试在工程中全局搜索 g_onExceptionEvent
,会发现这个方法被调用的地方,在 kscm_handleException
这个方法里,该方法的具体内容:
1 | void kscm_handleException(struct KSCrash_MonitorContext* context) |
尝试在工程中全局搜索下 kscm_handleException
,会发现这个方法在各种类型 Crash 被捕获的时候会被调用。
kscrash_setMonitoring
kscrash_setMonitoring
方法用于设置对各种 Crash 类型的监控。
我们来看下 kscrash_setMonitoring
方法的具体内容
1 | KSCrashMonitorType kscrash_setMonitoring(KSCrashMonitorType monitors) |
上述方法根据 g_installed
标记位判断是否进行崩溃监控。调用了 kscm_setActiveMonitors
方法,该方法的具体内容:
1 | void kscm_setActiveMonitors(KSCrashMonitorType monitorTypes) |
KSCrash 做了 Debug 监控,通过 ksdebug_isBeingTraced()
方法判断当前是否为 Debug 环境:
1 | bool ksdebug_isBeingTraced(void) |
再回到 kscm_setActiveMonitors
方法,首先做的是判断当前为 Debug 环境的话,就剔除掉对 MachException、Signal、CPPException、NSException 这几类 Crash 的监控。
具体做法就是根据传入的 monitorTypes 和 KSCrashMonitorTypeDebuggerUnsafe 做与操作判断:(monitorTypes & KSCrashMonitorTypeDebuggerUnsafe)
结果为 true 的话,将 monitorTypes 只保留 KSCrashMonitorTypeDebuggerSafe 选项:monitorTypes &= KSCrashMonitorTypeDebuggerSafe;
KSCrashMonitorTypeDebuggerUnsafe 和 KSCrashMonitorTypeDebuggerSafe 的定义为:
1 |
|
g_monitorsCount 的数据来自:
1 | static int g_monitorsCount = sizeof(g_monitors) / sizeof(*g_monitors); |
g_monitors 的数据来自:
1 | static Monitor g_monitors[] = |
这个 g_monitors 数组包含了 KSCrash 支持的各种崩溃监控。
遍历 g_monitors 数组,对每一项 monitor 进行 setMonitorEnabled
方法的调用:
1 | static inline void setMonitorEnabled(Monitor* monitor, bool isEnabled) |
在各种支持的崩溃类型里,会实现 setEnabled 方法,进行对各自崩溃类型的监控。
小结
到这里,KSCrash 的注册流程就很清楚了,通过注册 install 方法,调用 kscm_setEventCallback 方法将 onCrash 传递给一个全局变量,在各种类型的 Crash 被捕获时会调用这个 onCrash 方法。调用 kscrash_setMonitoring 方法中对各种类型的崩溃进行添加监控。
对于各种类型的崩溃是如何添加监控,以及捕获到崩溃之后是如果处理崩溃的,我们在后续篇章中再展开分析。