2016-03-31 41 views
11

在Objective-C中,NSSetUncaughtExceptionHandler可以注册一些功能来对异常进行最后一分钟的日志记录。如何捕捉Swift崩溃并执行一些日志记录

这没有发现Swift崩溃的东西。

是否可以在Swift中的全局级别执行此类操作?例如。如果在Swift代码中发生崩溃,请执行一些日志记录,如强制解包无可选项。

具体来说,我正在做一个实用程序来记录应用程序中的网络流量,如果发生崩溃,我想将我的内存数据刷新到磁盘。

+0

我想也许苹果公司没有像Refactor一样为此工作。 – Lumialxk

回答

1

有多个方面的解答,让我尝试回答他们:

  1. NSSetUncaughtExceptionHandler仅捕获未捕获的异常这是唯一可能崩溃的一小部分。
  2. Objective-C中的例外定义为致命的,不建议捕获它们,甚至更不建议运行任何非异步安全代码,其中包括任何Objective-C和Swift代码
  3. 要捕捉崩溃您需要设置信号处理程序,然后仅在崩溃时运行异步安全代码,这只是C的一小部分。尤其是在崩溃时您可能不会分配新内存。
  4. 请记住,当您的应用程序崩溃时,它将处于非常不稳定的代码中,并且对象或变量引用可能指向某种完全意想不到的情况。所以在碰撞时你根本不应该做任何事情。
  5. 处理崩溃的最佳开源方式是使用PLCrashReporter,它还提供了在崩溃时调用代码的方法。但是,这又必须是异步安全的。

到您的具体情况:你不应该这样做,而不是尝试。这可能会导致用户数据损坏或更多数据丢失。该应用程序崩溃严重的问题,而不是解决这个问题。

-1
NSSetUncaughtExceptionHandler(&HandleException); 
signal(SIGABRT, SignalHandler); 
signal(SIGILL, SignalHandler); 
signal(SIGSEGV, SignalHandler); 
signal(SIGFPE, SignalHandler); 
signal(SIGBUS, SignalHandler); 
signal(SIGPIPE, SignalHandler); 

这将适用于大多数情况。但我也试图找到一种方法来捕捉所有崩溃。那么,如果你comd +点击这些信号来查看文件,你会发现有超过20种信号,我所做的是信号(,)所有类型的信号。这似乎有效,但也许还有一些崩溃无法收集。

5

NSSetUncaughtExceptionHandler只适用于NSExceptions。请参阅this SO答案以获得精彩的解释。

要捕获Swift运行时错误,请执行SIGTRAP的信号处理程序。据我所知,Swift代码将终止与SIGTRAP异常类型的程序,如果它在运行时检测到意外情况,即只有SIGTRAP有助于捕获Swift错误,像SIGSEGV,SIGBUS,SIGILL休息不起作用。 我在this apple链接中找到了该信息。

如果你的代码是混合Objective-C和Swift,那么实现NSSetUncaughtExceptionHandler和信号处理程序来处理崩溃。

有关理解和实施信号处理请参阅this链接。

希望这会有所帮助。

+2

我为大多数信号(包括'SIGTRAP')添加了一个信号处理程序,但它不处理“致命错误:在解包可选值时意外发现零”。我还用'NSSetUncaughtExceptionHandler()'添加了一个异常处理程序...... –