Пользовательские обработчики сигналов не работают с Firebase Crashlytics на iOS - PullRequest
0 голосов
/ 16 марта 2020

Я интегрирую среду отчетности Firebase Crashlytics cra sh в мое приложение iOS. Приложение написано на Obj C и уже имеет пользовательские обработчики сигналов, поэтому возникает проблема, которую я наблюдаю - если пользовательские обработчики приложения инициализируются после пользовательских обработчиков Firebase Crashlytics - они не запускаются, но обработчики Crashlytics запускаются. С другой стороны, если мои обработчики приложений регистрируются первыми, то все работает должным образом.

Я проверил код Firebase Crashlytics, пытаясь найти причину, по которой любые более поздние сигналы не запускаются, но не могут перехватить ничего интересного.

Вот код, по которому сигнал запускается нажатием кнопки пользовательского интерфейса. Фактически я вижу cra sh, о котором сообщалось в Firebase Dashboard, но я не вижу файл, созданный handler_1, и не вижу сообщения NSLog.

#import "ViewController.h"
#import <signal.h>

@import Firebase;
@interface ViewController ()
@end

@implementation ViewController

static const int signals[] = {SIGSEGV, SIGFPE, SIGTRAP, SIGILL, SIGABRT, SIGPIPE, SIGBUS};
#define MAXSIG 14
struct sigaction handler_prev_1[MAXSIG];

void handler_1(int sig, siginfo_t* info, void* p) {
    NSString *someText = @"Random Text To Be Saved";
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *fileName = [[paths objectAtIndex:0]  stringByAppendingPathComponent:@"signal_handler.txt"];
    [someText writeToFile:fileName atomically:YES encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"Hello there!");
}

void register_handlers_1() {
    struct sigaction sa = {};
    sa.sa_sigaction = handler_1;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = SA_RESTART | SA_SIGINFO;
    for (int i = 0; i < sizeof(signals)/sizeof(signals[0]); i++)
    {
        int res = sigaction(signals[i], &sa, &handler_prev_1[signals[i]]);
        NSLog(@"Registering signal %d handler = %d", signals[i], res);
    }
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    // If I don't call this then the handler_1 is fired well
    [FIRApp configure];

    // Crashlytics is running a deffered signals check in (crashReportingSetupCompleted) after two seconds as I understand from their code,
    // so I am trying to avoid any unwanted interference with this 3 seconds sleep.
    [NSThread sleepForTimeInterval:3.000];

    register_handlers_1();

    UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(20, 50, 100, 30);
    [button setTitle:@"Crash" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(crashButtonTapped:)
        forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
}

- (IBAction)crashButtonTapped:(id)sender {
    *(volatile int*)0 = 0;
}
...