XuqmGroup-iOSSDK/Sources/XuqmBugCollectSDK/internal/CrashCapture.swift
XuqmGroup 227bc66bfd feat: 添加 iOS BugCollect 崩溃收集模块
新增模块:XuqmBugCollectSDK
- BugCollectSDK: 主入口,错误捕获 API
- CrashCapture: 崩溃捕获(NSException + POSIX 信号)
- IssueEvent/LogEvent: 数据模型
- Fingerprint: 错误指纹计算(SHA-256)
- LogQueue: 内存队列 + 定时上传
- LogStorage: 崩溃文件持久化
- LogUploader: HTTP 上传到服务端
- FunnelTracker: 漏斗追踪

功能:
- captureError/captureCrash 捕获错误
- addBreadcrumb 添加面包屑
- event 记录自定义事件
- warn/info 日志级别记录
- 自动初始化(onInitialize hook)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-19 03:38:22 +08:00

62 行
1.8 KiB
Swift

import Foundation
///
final class CrashCapture {
typealias CrashHandler = (NSException, String) -> Void
private let handler: CrashHandler
private var previousHandler: (@convention(c) (NSException) -> Void)?
init(handler: @escaping CrashHandler) {
self.handler = handler
}
///
func install() {
// Objective-C
previousHandler = NSGetUncaughtExceptionHandler()
NSSetUncaughtExceptionHandler { exception in
let stacktrace = exception.callStackSymbols.joined(separator: "\n")
//
CrashCapture.handleCrash(exception: exception, stacktrace: stacktrace)
// handler
CrashCapture.shared?.previousHandler?(exception)
}
// POSIX
installSignalHandlers()
}
private static var shared: CrashCapture?
private static func handleCrash(exception: NSException, stacktrace: String) {
shared?.handler(exception, stacktrace)
}
///
private func installSignalHandlers() {
let signals = [SIGABRT, SIGSEGV, SIGBUS, SIGFPE, SIGILL, SIGTRAP]
for sig in signals {
let prev = signal(sig) { sig in
let exception = NSException(
name: NSExceptionName("Signal \(sig)"),
reason: "Received signal \(sig)",
userInfo: nil
)
let stacktrace = Thread.callStackSymbols.joined(separator: "\n")
CrashCapture.handleCrash(exception: exception, stacktrace: stacktrace)
//
signal(sig, SIG_DFL)
raise(sig)
}
_ = prev
}
}
}