我正在 Mac OS X 上开发一个应用程序,该应用程序有时会崩溃(嗯,不是因为我的应用程序,而是由于它加载的第三方插件不稳定。这个应用程序实际上充当了崩溃防火墙;许多崩溃可能发生在启动时,因此此时无需向用户报告它)。
有没有办法防止崩溃报告窗口在用户面前弹出?
谢谢!
PS:这是关于这个窗口的,但不适用于 WebKit:
我正在 Mac OS X 上开发一个应用程序,该应用程序有时会崩溃(嗯,不是因为我的应用程序,而是由于它加载的第三方插件不稳定。这个应用程序实际上充当了崩溃防火墙;许多崩溃可能发生在启动时,因此此时无需向用户报告它)。
有没有办法防止崩溃报告窗口在用户面前弹出?
谢谢!
PS:这是关于这个窗口的,但不适用于 WebKit:
我不知道有任何真正受支持的解决方案,但有一些(丑陋的)方法可以实现它。
首先,您需要自己捕捉信号。我假设您知道如何做到这一点(请参阅 参考资料sigaction
)。然后在您的崩溃信号处理程序中,调用_exit()
. 那是带有前导下划线的。这是一个更快、更不安全的exit()
. 这通常会避免崩溃报告。我在一些 C++ 项目中使用了它,这些项目的内存管理非常糟糕,以至于它们经常在关机时崩溃。我并不为此感到骄傲;我只是说它有效....
另一种解决方案是在崩溃处理程序期间启动另一个第二个进程。第二个进程等待 CrashReporter 启动。当它发生时,杀死它。我最后一次测试这种方法是 10.5。我不知道 10.7 是否仍会启动相同类型的进程来显示该警报。
有关系统范围的解决方案,请阅读man ReportCrash
。但是,此解决方案并非特定于应用程序。
使用 cli Swift
4.2.1
基于Rob Napier的回答。
我不知道signal
(3) 是如何变成Darwin.signal(_:Int32,_:@convention(c)(Int32)->())
的,但以下内容实际上有效(防止记者发现未捕获的 NSException),而暂时执行和恢复defaults write com.apple.CrashReporter DialogType none && defaults write com.apple.CrashReporter UseUNC 1
(来自 osxdaily.com 2010和2015)(在我的 macOS 10.13 上)不起作用。
import Darwin
signal(SIGABRT ){n in _exit(128+n)}
(使用 Bash(1) 信号 exit(3) 约定。)
signal(SIGILL ){n in _exit(128+n)}
这也跳过了内置调用堆栈打印,尽管它没有显示 nil 的位置,但可以通过以下方式打印变体:
import Darwin
import Foundation
Thread.callStackSymbols.forEach{fputs($0+"\n",stderr)}