Ответ 1
Поместите это в AppDelegate.cs
:
[DllImport ("libc")]
private static extern int sigaction (Signal sig, IntPtr act, IntPtr oact);
enum Signal {
SIGBUS = 10,
SIGSEGV = 11
}
static void EnableCrashReporting ()
{
IntPtr sigbus = Marshal.AllocHGlobal (512);
IntPtr sigsegv = Marshal.AllocHGlobal (512);
// Store Mono SIGSEGV and SIGBUS handlers
sigaction (Signal.SIGBUS, IntPtr.Zero, sigbus);
sigaction (Signal.SIGSEGV, IntPtr.Zero, sigsegv);
// Enable crash reporting libraries
EnableCrashReportingUnsafe ();
// Restore Mono SIGSEGV and SIGBUS handlers
sigaction (Signal.SIGBUS, sigbus, IntPtr.Zero);
sigaction (Signal.SIGSEGV, sigsegv, IntPtr.Zero);
Marshal.FreeHGlobal (sigbus);
Marshal.FreeHGlobal (sigsegv);
}
static void EnableCrashReportingUnsafe ()
{
// Run your crash reporting library initialization code here--
// this example uses HockeyApp but it should work well
// with TestFlight or other libraries.
// Verify in documentation that your library of choice
// installs its sigaction hooks before leaving this method.
var manager = BITHockeyManager.SharedHockeyManager;
manager.Configure (HockeyAppId, null);
manager.StartManager ();
}
Вызов EnableCrashReporting ()
в начале метода FinishedLaunching
.
Оберните этот вызов в директиве #if !DEBUG
, если хотите.
Как это работает?
Я последовал за предложением Рольфа:
Одно из возможных решений - позволить моно обрабатывать все сигналы SIGSEGV (технически говоря, сообщение об ошибке сбоя должно либо не обрабатываться сигнал SIGSEGV, или он должен быть привязан к моно-обработчику и не выполнять любая обработка сама по себе). Если моно определяет, что сигнал SIGSEGV не из управляемого кода (т.е. что-то очень плохое произошло), это будет поднимите сигнал SIGABORT (который должен сообщить об ошибке обрабатывать и обрабатывать как авария). Как вы можете понять, это что-то это должно быть сделано в библиотеке отчетов о сбоях.
И Ландон Фуллер Цель C:
#import <signal.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
/* Save Mono signal handler actions */
struct sigaction sigbus_action, sigsegv_action;
sigaction(SIGBUS, NULL, &sigbus_action);
sigaction(SIGSEGV, NULL, &sigsegv_action);
// Enable the crash reporter here. Ie, [[PLCrashReporter sharedReporter] enableCrashReporterAndReturnError:],
// or whatever is the correct initialization mechanism for the crash reporting service you're using
/* Restore Mono signal handlers */
sigaction(SIGBUS, &sigbus_action, NULL);
sigaction(SIGSEGV, &sigsegv_action, NULL);
return YES;
}
Я использовал исходный код Banshee в качестве отправной точки для вызова sigaction
из MonoTouch.
Надеюсь, что это поможет!