//处理信号类型的异常
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