如何捕捉Swift崩溃并做一些日志logging

在Objective-C中, NSSetUncaughtExceptionHandler可以注册一些function来对exception做最后一分钟的logging。

这没有抓到从Swift崩溃的东西。

是否有可能在Swift的全球层面上做这样的事情? 例如,如果在Swift代码中发生崩溃,请执行一些日志logging,就像强制解包nil可选。

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

NSSetUncaughtExceptionHandler只能用于NSExceptions。 看到这个答案的辉煌解释。

捕捉Swift运行时错误为SIGTRAP实现信号处理程序。 据我所知,如果在运行时检测到意外情况,Swift代码将终止SIGTRAPexceptiontypes的程序,即只有SIGTRAP有助于捕获Swift错误,像SIGSEGVSIGBUSSIGILL一样不起作用。 我在这个苹果链接中find了这个信息。

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

为了理解和实施信号处理,请参阅此链接。

希望这可以帮助。

你的问题有多个方面,让我试着回答他们:

  1. NSSetUncaughtExceptionHandler只捕获未捕获的exception,这只是可能崩溃的一小部分。
  2. Objective-C中的exception被定义为致命的,不build议捕捉它们,甚至不build议运行任何非asynchronous安全代码,其中包括任何Objective-C和Swift代码
  3. 为了捕捉崩溃,您需要设置信号处理程序,然后只在崩溃时运行asynchronous安全的代码,这只是C的一小部分。尤其是在崩溃时间,您可能不会分配新的内存。
  4. 请记住,当你的应用程序崩溃,它是在一个非常不稳定的代码和对象或variables引用可能指向一些完全意外的事情。 所以在碰撞时你根本不应该做任何事情。
  5. 处理崩溃的最好的开源方法是使用PLCrashReporter ,它也提供了在崩溃时调用代码的方法。 但是,这又必须是asynchronous安全的。

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

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

这将适用于大多数情况。 但我也试图find一些方法来赶上所有的崩溃。 那么,如果你通过点击这些信号来查看文件,你会发现有20多种信号,我所做的就是信号信号。 这似乎有效,但也许还有一些崩溃不能收集。