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 } } }