3

我正在 Mac OS X 上开发一个应用程序,该应用程序有时会崩溃(嗯,不是因为我的应用程序,而是由于它加载的第三方插件不稳定。这个应用程序实际上充当了崩溃防火墙;许多崩溃可能发生在启动时,因此此时无需向用户报告它)。

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

谢谢!

PS:这是关于这个窗口的,但不适用于 WebKit: Mac OS X 上的崩溃报告窗口

4

3 回答 3

4

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

首先,您需要自己捕捉信号。我假设您知道如何做到这一点(请参阅 参考资料sigaction)。然后在您的崩溃信号处理程序中,调用_exit(). 那是带有前导下划线的。这是一个更快、更不安全的exit(). 这通常会避免崩溃报告。我在一些 C++ 项目中使用了它,这些项目的内存管理非常糟糕,以至于它们经常在关机时崩溃。我并不为此感到骄傲;我只是说它有效....

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

于 2012-05-11T15:06:24.283 回答
2

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

于 2012-05-11T14:50:55.773 回答
1

使用 cli Swift4.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 20102015)(在我的 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)}
于 2019-02-23T14:49:18.913 回答