在Objective-C中,NSSetUncaughtExceptionHandler
可以注册一些功能来对异常进行最后一分钟的日志记录。如何捕捉Swift崩溃并执行一些日志记录
这没有发现Swift崩溃的东西。
是否可以在Swift中的全局级别执行此类操作?例如。如果在Swift代码中发生崩溃,请执行一些日志记录,如强制解包无可选项。
具体来说,我正在做一个实用程序来记录应用程序中的网络流量,如果发生崩溃,我想将我的内存数据刷新到磁盘。
在Objective-C中,NSSetUncaughtExceptionHandler
可以注册一些功能来对异常进行最后一分钟的日志记录。如何捕捉Swift崩溃并执行一些日志记录
这没有发现Swift崩溃的东西。
是否可以在Swift中的全局级别执行此类操作?例如。如果在Swift代码中发生崩溃,请执行一些日志记录,如强制解包无可选项。
具体来说,我正在做一个实用程序来记录应用程序中的网络流量,如果发生崩溃,我想将我的内存数据刷新到磁盘。
有多个方面的解答,让我尝试回答他们:
NSSetUncaughtExceptionHandler
仅捕获未捕获的异常这是唯一可能崩溃的一小部分。到您的具体情况:你不应该这样做,而不是尝试。这可能会导致用户数据损坏或更多数据丢失。该应用程序崩溃严重的问题,而不是解决这个问题。
NSSetUncaughtExceptionHandler(&HandleException);
signal(SIGABRT, SignalHandler);
signal(SIGILL, SignalHandler);
signal(SIGSEGV, SignalHandler);
signal(SIGFPE, SignalHandler);
signal(SIGBUS, SignalHandler);
signal(SIGPIPE, SignalHandler);
这将适用于大多数情况。但我也试图找到一种方法来捕捉所有崩溃。那么,如果你comd +点击这些信号来查看文件,你会发现有超过20种信号,我所做的是信号(,)所有类型的信号。这似乎有效,但也许还有一些崩溃无法收集。
NSSetUncaughtExceptionHandler
只适用于NSExceptions。请参阅this SO答案以获得精彩的解释。
要捕获Swift运行时错误,请执行SIGTRAP
的信号处理程序。据我所知,Swift代码将终止与SIGTRAP
异常类型的程序,如果它在运行时检测到意外情况,即只有SIGTRAP
有助于捕获Swift错误,像SIGSEGV
,SIGBUS
,SIGILL
休息不起作用。 我在this apple链接中找到了该信息。
如果你的代码是混合Objective-C和Swift,那么实现NSSetUncaughtExceptionHandler
和信号处理程序来处理崩溃。
有关理解和实施信号处理请参阅this链接。
希望这会有所帮助。
我为大多数信号(包括'SIGTRAP')添加了一个信号处理程序,但它不处理“致命错误:在解包可选值时意外发现零”。我还用'NSSetUncaughtExceptionHandler()'添加了一个异常处理程序...... –
我想也许苹果公司没有像Refactor一样为此工作。 – Lumialxk