本文共 1485 字,大约阅读时间需要 4 分钟。
signal信号:
signal是一种软中断信号,提供异步事件处理机制。
signal是进程间相互传递信息的一种粗糙方法,使用场景: 进程终止相关;
终端交互;
编程错误或硬件错误相关,系统遇到不可恢复的错误时触发崩溃机制让程序退出,比如:除0、内存写入错误等。
这里我们主要考虑系统遇到不可恢复的错误时即Crash时,信号相关的应用。signal信号处理是UNIX操作系统机制,可以基于signal来捕获Android Native Crash。signal注册和处理signal():
注册signal handler;调用成功时,会移除signo信号当前的操作,以handler指定的新信号处理程序替代;
信号处理函数返回void,因为没有地方给该函数返回。注册自定义信号处理函数,构造Crash后,发出信号并执行自定义信号处理逻辑。
Xcode Debug运行时,添加断点,在Crash触发前,执行pro hand -p true -s false SIGABRT命令。
1、
#define CALLSTACK_SIG SIGUSR1
signal(CALLSTACK_SIG, thread_singal_handler);
2、
static void thread_singal_handler(int sig)
{ NSLog(@"main thread catch signal: %d", sig); if (sig != CALLSTACK_SIG) { return; } NSArray* callStack = [NSThread callStackSymbols]; id<PMainThreadWatcherDelegate> del = [PMainThreadWatcher sharedInstance].watchDelegate; if (del != nil && [del respondsToSelector:@selector(onMainThreadSlowStackDetected:)]) { [del onMainThreadSlowStackDetected:callStack]; } else { NSLog(@"detect slow call stack on main thread! \n"); for (NSString* call in callStack) { NSLog(@"%@\n", call); } } return; }问题:Xcode Debug 调试时 thread_singal_handler,不被执行。
解决:参考《Xcode里调试signal的信号回调处理函数》的设置 :
pro hand -p true -s false SIGUSR1
就可以 执行 相应的回调函数 thread_singal_handler 了。
参考:iOS Mach异常和signal信号
以下是《Xcode里调试signal的信号回调处理函数》中内容 ()
我们在我的代码里添加了异常捕获功能,包括对signal的捕获
但是在Xcode里调试的时候,程序不会进入bugrpt_signalHandler处理函数里面,为什么呢?
因为Xcode屏蔽了signal的回调,我们需要在lldb中输入以下命令,signal的回调就可以进来了
pro hand -p true -s false SIGABRT
注意:SIGABRT可以替换为你需要的任何signal类型,比如SIGSEGV