99 lines
2.6 KiB
Swift
99 lines
2.6 KiB
Swift
//
|
|
// Example
|
|
// man
|
|
//
|
|
// Created by man 11/11/2018.
|
|
// Copyright © 2020 man. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
import Darwin
|
|
|
|
func exceptionHandler(exception: NSException) {
|
|
if CrashLogger.shared.crashed {
|
|
return
|
|
}
|
|
CrashLogger.shared.crashed = true
|
|
CrashLogger.addCrash(name: exception.name.rawValue, reason: exception.reason)
|
|
}
|
|
|
|
func handleSignal(signal: Int32) {
|
|
if CrashLogger.shared.crashed {
|
|
return
|
|
}
|
|
CrashLogger.shared.crashed = true
|
|
switch signal {
|
|
case SIGILL:
|
|
CrashLogger.addCrash(name: "SIGILL", reason: nil)
|
|
case SIGABRT:
|
|
CrashLogger.addCrash(name: "SIGABRT", reason: nil)
|
|
case SIGFPE:
|
|
CrashLogger.addCrash(name: "SIGFPE", reason: nil)
|
|
case SIGBUS:
|
|
CrashLogger.addCrash(name: "SIGBUS", reason: nil)
|
|
case SIGSEGV:
|
|
CrashLogger.addCrash(name: "SIGSEGV", reason: nil)
|
|
case SIGSYS:
|
|
CrashLogger.addCrash(name: "SIGSYS", reason: nil)
|
|
case SIGPIPE:
|
|
CrashLogger.addCrash(name: "SIGPIPE", reason: nil)
|
|
case SIGTRAP:
|
|
CrashLogger.addCrash(name: "SIGTRAP", reason: nil)
|
|
default: break
|
|
}
|
|
}
|
|
|
|
class CrashLogger {
|
|
|
|
static let shared = CrashLogger()
|
|
private init() {}
|
|
|
|
var hasBeenRegistered = false
|
|
var crashed = false
|
|
var enable: Bool = false {
|
|
didSet {
|
|
if enable {
|
|
CrashLogger.shared.register()
|
|
}
|
|
else {
|
|
CrashLogger.shared.unregister()
|
|
}
|
|
}
|
|
}
|
|
|
|
func register() {
|
|
if hasBeenRegistered == false {
|
|
hasBeenRegistered = true
|
|
NSSetUncaughtExceptionHandler(exceptionHandler)
|
|
signal(SIGILL, handleSignal)
|
|
signal(SIGABRT, handleSignal)
|
|
signal(SIGFPE, handleSignal)
|
|
signal(SIGBUS, handleSignal)
|
|
signal(SIGSEGV, handleSignal)
|
|
signal(SIGSYS, handleSignal)
|
|
signal(SIGPIPE, handleSignal)
|
|
signal(SIGTRAP, handleSignal)
|
|
}
|
|
}
|
|
|
|
func unregister() {
|
|
if hasBeenRegistered == true {
|
|
hasBeenRegistered = false
|
|
NSSetUncaughtExceptionHandler(nil)
|
|
signal(SIGILL, SIG_DFL)
|
|
signal(SIGABRT, SIG_DFL)
|
|
signal(SIGFPE, SIG_DFL)
|
|
signal(SIGBUS, SIG_DFL)
|
|
signal(SIGSEGV, SIG_DFL)
|
|
signal(SIGSYS, SIG_DFL)
|
|
signal(SIGPIPE, SIG_DFL)
|
|
signal(SIGTRAP, SIG_DFL)
|
|
}
|
|
}
|
|
|
|
static func addCrash(name: String, reason: String?) {
|
|
let newCrash = _CrashModel(name: name, reason: reason)
|
|
CrashStoreManager.shared.addCrash(newCrash)
|
|
}
|
|
}
|