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

来源:互联网 发布:真盖塔 知乎 编辑:程序博客网 时间:2024/05/22 17:02

//处理信号类型的异常

void SignalExceptionHandler(int signal)

{

    

    NSMutableString *mstr = [[NSMutableStringalloc] 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 <frames; ++i) {

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

    }

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

//    for (i=0; i<UncaughtExceptionHandlerReportAddressCount; i++) {

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

//    }

//    free(strs);

    [SignalHandlersaveCreash: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


原创粉丝点击