ios 收集crash xcode 调试 捕捉signal信号

//处理信号类型的异常

void SignalExceptionHandler(int signal)

{

    

    NSMutableString *mstr = [[NSMutableString alloc] init];

    [mstr appendString:@"Stack:\n"];

    void* callstack[128];//堆栈方法数组

    int i, frames = backtrace(callstack, 128);//iOS的方法backtrace中获取错误堆栈方法指针数组,返回数目

    char** strs = backtrace_symbols(callstack, frames);//符号化

    for (i = 0; i

        [mstr appendFormat:@"%s\n", strs[i]];

    }

//    NSMutableArray *symbolsBackTrace=[NSMutableArray arrayWithCapacity:frames];

//    for (i=0; i

//        [symbolsBackTrace addObject:[NSString stringWithUTF8String:strs[i]]];

//    }

//    free(strs);

    [SignalHandler saveCreash:mstr];


}


void InstallSignalHandler(void)

{

    signal(SIGHUP, SignalExceptionHandler);

    signal(SIGINT, SignalExceptionHandler);

    signal(SIGQUIT, SignalExceptionHandler);

    

    signal(SIGABRT, SignalExceptionHandler);

    signal(SIGILL, SignalExceptionHandler);

    signal(SIGSEGV, SignalExceptionHandler);

    signal(SIGFPE, SignalExceptionHandler);

    signal(SIGBUS, SignalExceptionHandler);

    signal(SIGPIPE, SignalExceptionHandler);

}



关于signal信号的捕捉,在Xcode调试时,Debugger模式会先于我们的代码catch到所有的crash,所以需要直接从模拟器中进入程序才可以测试


http://blog.csdn.net/skylin19840101/article/details/52935637


但是在Xcode里调试的时候,程序不会进入SignalExceptionHandler处理函数里

我们需要在lldb中输入以下命令,signal的回调就可以进来了

pro hand -p true -s false SIGABRT

注意:SIGABRT可以替换为你需要的任何signal类型,比如SIGSEGV


你可能感兴趣的:(ios 收集crash xcode 调试 捕捉signal信号)