Mac OS X:防止崩溃报告窗口出现在我的应用程序中

时间:2012-05-11 14:46:41

标签: objective-c macos cocoa macos-carbon crash-reports

我正在Mac OS X上开发一个应用程序,怀疑有时会崩溃(好吧,不是因为我的应用程序,但由于它加载了不稳定的第三方插件。这个应用程序实际上充当了防火墙;很多崩溃都可能在启动时发生,因此此时无需向用户提出错误消息。)

有没有办法阻止崩溃报告窗口在用户面前弹出?

谢谢!

PS:这是关于这个窗口,但不适用于WebKit: A crash reporting window on Mac OS X

3 个答案:

答案 0 :(得分:4)

我不知道任何真正支持的解决方案,但有一些(丑陋的)方法来实现它。

首先,你需要自己捕捉信号。我假设你知道如何做到这一点(见sigaction)。然后在崩溃信号处理程序中,调用_exit()。这是领先的下划线。它是exit()的更快,更不安全的版本。这通常会避免崩溃报告者。我在一些C ++项目中使用过这种方法,这些项目具有这样的密钥内存管理,它们经常在关机时崩溃。我并不以此为荣;我只是说它有效......

另一种解决方案是在崩溃处理程序期间启动另一个第二个进程。第二个进程等待CrashReporter启动。当它发生时,杀死它。我最后一次测试这种方法是10.5。我不知道10.7是否仍然启动相同类型的过程来显示该警报。

答案 1 :(得分:1)

对于系统范围的解决方案,请阅读man ReportCrash。但是,此解决方案并非特定于应用程序。

答案 2 :(得分:1)

使用cli Swift 4.2.1

Rob Napieranswer为基础。
我不知道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)约定。)


继续,我发现“意外发现nil”错误(在我的情况下是由于隐式展开)使用了另一个信号:

signal(SIGILL   ){n in _exit(128+n)}

这也跳过了内置调用堆栈的打印,尽管它始终不显示nil的位置,但是可以通过以下方式打印变体:

import Darwin
import Foundation
Thread.callStackSymbols.forEach{fputs($0+"\n",stderr)}