SORU
24 Ocak 2013, PERŞEMBE


Nasıl MonoTouch uygulamalar çökmesini iOS crash gazetecilere önlemek için?

İOS, TestFlight HockeyApp de dahil olmak üzere, kaza raporlama kütüphaneler iOS var. Eğer hizmetlere bağlı istemesen bile, hala PLCrashReporter gibi kütüphaneleri kullanabilirsiniz. Kamu API genellikle birkaç başlatma yöntemleri ile dersleri bir çift oluşur çünkü bu kütüphaneler bağlama fairly trivial.

TestFlight, ve bizim uygulama daha sonra HockeyApp kullanmaya çalışırken ancak, bizim app rasgele çökmesine başladı. Bu çıkıyorbilinen bir sorun 15* several times*, ama Xamarin bu konuda uyarmaz, nispeten karanlık ve zor yolu bulduk.

Biz bunu öğrendiktüm kaza gazeteciler null başvuru özel durumlar kapmasını önlemek Mono iOS:

try {
    object o = null;
    o.GetHashCode ();
} catch {
    // Catch block isn't called with crash reporting enabled.
    // Instead, the app will crash.
}

Peki neden böyle oluyor? Rolf, Xamarin bir geliştirici, alıntı

Bir null başvuru özel aslında ilk başta SIGSEGV sinyali. Genellikle mono çalışma zamanı bu işler ve nullreference bir durum haline çevirir, devam etmek çalıştırılmasına izin verebilir. Sorun SIGSEGV sinyali olmasıdır ObjC uygulamalar çok kötü bir şey (ve yönetilen kod dışında oluştuğunda), herhangi bir kilitlenme çözüm kilitlenme gibi (ve app öldürmek) rapor açıkladı - bu MonoTouch, SIGSEGV işlemek için bir şans olur, yani önce olur hiçbir şey MonoTouch bu konuda ne yapabilirim.

Birçok çöküyor neden bilmeden MonoTouch apps TestFlight kullanın eminim.
Isn't it ironic?

Nasıl kaza raporlama kütüphaneler kazanıyorsundeğilMonoTouch apps kazası mı?

CEVAP
24 Ocak 2013, PERŞEMBE


AppDelegate.cs koy:

[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 ();
}

FinishedLaunching yöntem başında EnableCrashReporting () Ara.
Eğer isterseniz #if !DEBUG yönergesinde bu çağrı alın.


Nasıl çalışır?

Rolf önerisi takip ettim:

Olası bir çözüm, mono tüm SIGSEGV sinyali işlemek için izin vermektir (teknik olarak kilitlenme raporlaması lib işlemek gerekir, ya da değil handler'ın mono için zincir ve yapmalı SIGSEGV sinyali, ya da tek başına herhangi bir işlem). Eğer mono SIGSEGV sinyali belirlerse bu yönetilen kod (çok kötü bir şey oldu yani) değil SİGABORT bir sinyal kaza lib raporlama gerektiğini zaten (zam idare ve kaza gibi) davranın. Bu bir şey olduğunu anlarsın bu kaza kütüphane raporlama yapılmalıdır.

Ve Landon Fuller'In Objective C uygulama:

#import <signal.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    /* Save Mono's 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's signal handlers */
    sigaction(SIGBUS, &sigbus_action, NULL);
    sigaction(SIGSEGV, &sigsegv_action, NULL);

    return YES;
}

MonoTouch sigaction aramak için bir referans noktası olarak Banshee source code kullandım.

Umarım bu yardımcı olur!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Gavin Hoey

    Gavin Hoey

    21 Aralık 2007
  • hockeywebcasts

    hockeywebcas

    31 EKİM 2012
  • sWooZie

    sWooZie

    9 ŞUBAT 2006