iOS中有很多iOS崩溃报告库,包括TestFlight和HockeyApp.如果您不想依赖服务,您仍然可以使用PLCrashReporter之类的库.绑定这些库是相当简单的,因为它们的公共API通常由几个具有多个初始化方法的类组成.
但是,在我们的应用程序中尝试使用TestFlight和更高版本的HockeyApp时,我们的应用程序开始随机崩溃.事实证明,这是一个已知的问题报道的 若干 倍,但Xamarin不发出警告,它是相对模糊的,我们发现它的艰辛的道路.
我们了解到所有iOS崩溃记录器都阻止Mono捕获空引用异常:
try {
object o = null;
o.GetHashCode ();
} catch {
// Catch block isn't called with crash reporting enabled.
// Instead, the app will crash.
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?引用Xamarin开发人员Rolf,
空引用异常实际上是SIGSEGV信号.通常单声道运行时处理它并将其转换为空引用异常,允许继续执行.问题是在ObjC应用程序中SIGSEGV信号是一件非常糟糕的事情(当它发生在托管代码之外时),因此任何崩溃报告解决方案都会将其报告为崩溃(并杀死应用程序) - 这在MonoTouch获得机会之前发生处理SIGSEGV,因此MonoTouch无法做到这一点.
我相信很多人在MonoTouch应用程序中使用TestFlight而不知道它会导致崩溃.
这不具讽刺意味吗?
如何使崩溃报告库不会崩溃MonoTouch应用程序?