新增模块: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>
62 行
1.8 KiB
Swift
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
|
|
}
|
|
}
|
|
}
|