Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义信号处理程序在iOS上不使用Firebase Crashlytics_Ios_Objective C_Firebase_Crashlytics_Sigaction - Fatal编程技术网

自定义信号处理程序在iOS上不使用Firebase Crashlytics

自定义信号处理程序在iOS上不使用Firebase Crashlytics,ios,objective-c,firebase,crashlytics,sigaction,Ios,Objective C,Firebase,Crashlytics,Sigaction,我正在将Firebase Crashlytics崩溃报告框架集成到我的iOS应用程序中。应用程序是用ObjC编写的,并且已经有自定义信号处理程序,因此我观察到一个问题——如果应用程序自定义处理程序是在Firebase Crashlytics自定义处理程序之后初始化的——它们不会启动,但Crashlytics处理程序会启动。另一方面,如果首先注册了我的应用程序处理程序,那么所有处理程序都可以正常工作 我检查了Firebase Crashlytics代码,试图找到任何后续信号未被触发的原因,但无法捕

我正在将Firebase Crashlytics崩溃报告框架集成到我的iOS应用程序中。应用程序是用ObjC编写的,并且已经有自定义信号处理程序,因此我观察到一个问题——如果应用程序自定义处理程序是在Firebase Crashlytics自定义处理程序之后初始化的——它们不会启动,但Crashlytics处理程序会启动。另一方面,如果首先注册了我的应用程序处理程序,那么所有处理程序都可以正常工作

我检查了Firebase Crashlytics代码,试图找到任何后续信号未被触发的原因,但无法捕获任何有趣的内容

以下是通过按下UI按钮触发信号的代码。事实上,我在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;
}
#导入“ViewController.h”
#进口
@进口火基;
@界面视图控制器()
@结束
@实现视图控制器
静态常数int信号[]={SIGSEGV、SIGFPE、SIGTRAP、SIGILL、SIGABRT、SIGPIPE、SIGBUS};
#定义MAXSIG 14
struct sigaction handler_prev_1[MAXSIG];
void handler_1(int sig,siginfo_t*info,void*p){
NSString*someText=@“要保存的随机文本”;
NSArray*Path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,是);
NSString*文件名=[[paths objectAtIndex:0]stringByAppendingPathComponent:@“signal_handler.txt”];
[someText WriteFile:文件名原子:是编码:NSUTF8StringEncoding错误:nil];
NSLog(@“你好!”);
}
无效寄存器\u处理程序\u 1(){
结构sigaction sa={};
sa.sa_sigaction=handler_1;
sigemptyset(和sa.sa_面具);
sa.sa_flags=sa_重启| sa_SIGINFO;
对于(int i=0;i
Crashlytics支持-据我所知,iOS要求一次只能有一个异常处理程序。如果它现在在您自己初始化Crashlytics之后起作用,那么这似乎更为间接,也不符合预期。在任何情况下,作为Crashlytics工作的一个硬要求,Crashlytics可能不会还原异常处理程序供您使用(至少以您配置所有内容的方式)。感谢@KevinKokomani的输入,我被告知与Crashlytics注册的Mach异常处理程序有关。如果处理程序未注册,则两个信号处理程序都工作正常。然而,我在苹果文档或其他文档中找不到任何官方参考:(是的,不幸的是,这个案例通常不应该那么好用,这也是我们从其他客户那里看到的。如果你能够以一致的方式使它工作,那将非常有趣。