我正在Mac OS X上开发一个应用程序,怀疑有时会崩溃(好吧,不是因为我的应用程序,但由于它加载了不稳定的第三方插件。这个应用程序实际上充当了防火墙;很多崩溃都可能在启动时发生,因此此时无需向用户提出错误消息。)
有没有办法阻止崩溃报告窗口在用户面前弹出?
谢谢!
PS:这是关于这个窗口,但不适用于WebKit:
答案 0 :(得分:4)
我不知道任何真正支持的解决方案,但有一些(丑陋的)方法来实现它。
首先,你需要自己捕捉信号。我假设你知道如何做到这一点(见sigaction
)。然后在崩溃信号处理程序中,调用_exit()
。这是领先的下划线。它是exit()
的更快,更不安全的版本。这通常会避免崩溃报告者。我在一些C ++项目中使用过这种方法,这些项目具有这样的密钥内存管理,它们经常在关机时崩溃。我并不以此为荣;我只是说它有效......
另一种解决方案是在崩溃处理程序期间启动另一个第二个进程。第二个进程等待CrashReporter启动。当它发生时,杀死它。我最后一次测试这种方法是10.5。我不知道10.7是否仍然启动相同类型的过程来显示该警报。
答案 1 :(得分:1)
对于系统范围的解决方案,请阅读man ReportCrash
。但是,此解决方案并非特定于应用程序。
答案 2 :(得分:1)
使用cli Swift
4.2.1
以Rob Napier的answer为基础。
我不知道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 {{ 3}}和2010)(在我的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)}