如何捕获Swift崩溃并进行一些日志记录

Ken*_* Ko 15 crash exception ios swift

在Objective-C中,NSSetUncaughtExceptionHandler可以注册一些功能来做最后一分钟的异常日志记录.

这并没有抓住Swift崩溃的东西.

是否有可能在Swift的全球范围内做这样的事情?例如,如果在Swift代码中发生崩溃,请执行一些日志记录,例如强制解包nil可选.

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

SHN*_*SHN 9

NSSetUncaughtExceptionHandler仅适用于NSExceptions.看到这个SO答案的精彩解释.

要捕获Swift运行时错误,请执行信号处理程序SIGTRAP.据我所知,SWIFT CODE将终止与该程序SIGTRAP,如果它检测在运行时只,即意外情况异常类型SIGTRAP有利于捕捉斯威夫特错误,其余的像SIGSEGV,SIGBUS,SIGILL不工作.我在这个苹果链接中找到了这个信息.

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

有关理解和实现信号处理,请参阅链接.

希望这可以帮助.

  • 我为大多数信号添加了一个信号处理程序(包括`SIGTRAP`),但是它没有处理"致命错误:在解包一个Optional值时意外地发现了nil".我还添加了一个带有`NSSetUncaughtExceptionHandler()`的异常处理程序... (3认同)

Zai*_*jum 7

Swift 5 你可以像这样处理应用程序崩溃

NSSetUncaughtExceptionHandler { (exception) in
   let stack = exception.callStackReturnAddresses
   print("Stack trace: \(stack)")

    }
Run Code Online (Sandbox Code Playgroud)


Ker*_*rni 4

你的问题有多个方面,我来尝试解答一下:

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

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