IOS开发如何通过覆盖问题来解决捕获信号处理程序

时间:2018-01-15 07:05:48

标签: ios objective-c c

我想让项目中现有的单一处理程序和我自己的单一处理程序共存,这样两者都可以正确地捕获单数。

typedef void (*signalHandler)(int signo, siginfo_t *info, void *context); static signalHandler previousSignalHandler = NULL; void signalExceptionHandler(int signal, siginfo_t* info, void* context) { NSMutableString *mstr = [[NSMutableString alloc] init]; [mstr appendString:@"Stack:\n"]; void* callstack[128]; int i, frames = backtrace(callstack, 128); char** strs = backtrace_symbols(callstack, frames); for (i = 0; i <frames; ++i) { [mstr appendFormat:@"%s\n", strs[i]]; } BYLOGI(@"%@",mstr); [BYCrashCacheHelper saveAppCrashDataWithCrashInfo:mstr]; if (previousSignalHandler) { previousSignalHandler(signal, info, context); } } void signalRegister(int signal) { struct sigaction action; action.sa_sigaction = signalExceptionHandler; action.sa_flags = SA_NODEFER | SA_SIGINFO; sigemptyset(&action.sa_mask); sigaction(signal, &action, 0); } void judgePreviousSignalHandlerAndSignalRegister(int signal) { struct sigaction old_action; sigaction(signal, NULL, &old_action); if (old_action.sa_flags & SA_SIGINFO) { previousSignalHandler = old_action.sa_sigaction; } signalRegister(signal); } void installSignalHandler(void) { judgePreviousSignalHandlerAndSignalRegister(SIGHUP); judgePreviousSignalHandlerAndSignalRegister(SIGINT); judgePreviousSignalHandlerAndSignalRegister(SIGQUIT); judgePreviousSignalHandlerAndSignalRegister(SIGABRT); judgePreviousSignalHandlerAndSignalRegister(SIGILL); judgePreviousSignalHandlerAndSignalRegister(SIGSEGV); judgePreviousSignalHandlerAndSignalRegister(SIGFPE); judgePreviousSignalHandlerAndSignalRegister(SIGBUS); judgePreviousSignalHandlerAndSignalRegister(SIGPIPE); }

我在一些博客中找到了上述方法,但经过调试后,我发现它无法访问上一个处理程序。 对不起,如何正确获取前一个处理程序,并避免处理程序覆盖问题?

0 个答案:

没有答案