300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 软件测试之SDK开发(ios)——signal捕获

软件测试之SDK开发(ios)——signal捕获

时间:2021-10-09 06:19:45

相关推荐

软件测试之SDK开发(ios)——signal捕获

signal是一种软中断信号,提供异步事件处理机制。signal是进程间相互传递信息的一种粗糙方法,使用场景如下:

进程终止终端交互编程错误或硬件错误相关,系统遇到不可恢复的错误时触发崩溃机制让程序退出,比如:除0,内存写入错误等。

这里我们主要考虑系统遇到不可恢复的错误即Crash时,信号相关的应用。此类致命signal有很多,简单列举如下:

SIGABRT–程序中止命令中止信号SIGALRM–程序超时信号SIGFPE–程序浮点异常信号SIGILL–程序非法指令信号SIGHUP–程序终端中止信号SIGINT–程序键盘中断信号SIGKILL–程序结束接收中止信号SIGTERM–程序kill中止信号SIGSTOP–程序键盘中止信号SIGSEGV–程序无效内存中止信号SIGBUS–程序内存字节未对齐中止信号SIGPIPE–程序Socket发送失败中止信号

signal的捕获可以使用signal函数,将signal抛给处理函数进行处理,通过signal 的name 和线程的callStackSymbols等信息即可定位该signal发生的场景。如下所示:

void SignalHandler(int sig){// See /questions/40631334/how-to-intercept-exc-bad-instruction-when-unwrapping-nil.NSString *name = @"Unknown signal";switch (sig) {case SIGHUP:{name = @"SIGHUP";}break;case SIGINT:{name = @"SIGINT";}break;case SIGQUIT:{name = @"SIGQUIT";}break;case SIGILL:{name = @"SIGILL";}break;case SIGTRAP:{name = @"SIGTRAP";}break;case SIGABRT:{name = @"SIGABRT";}break;#ifdef SIGPOLLcase SIGPOLL:{name = @"SIGPOLL";}break;#endifcase SIGEMT:{name = @"SIGEMT";}break;case SIGFPE:{name = @"SIGFPE";}break;case SIGKILL:{name = @"SIGKILL";}break;case SIGBUS:{name = @"SIGBUS";}break;case SIGSEGV:{name = @"SIGSEGV";}break;case SIGSYS:{name = @"SIGSYS";}break;case SIGPIPE:{name = @"SIGPIPE";}break;case SIGALRM:{name = @"SIGALRM";}break;case SIGTERM:{name = @"SIGTERM";}break;case SIGURG:{name = @"SIGURG";}break;case SIGSTOP:{name = @"SIGSTOP";}break;case SIGTSTP:{name = @"SIGTSTP";}break;case SIGCONT:{name = @"SIGCONT";}break;case SIGCHLD:{name = @"SIGCHLD";}break;case SIGTTIN:{name = @"SIGTTIN";}break;case SIGTTOU:{name = @"SIGTTOU";}break;#ifdef SIGIOcase SIGIO:{name = @"SIGIO";}break;#endifcase SIGXCPU:{name = @"SIGXCPU";}break;case SIGXFSZ:{name = @"SIGXFSZ";}break;case SIGVTALRM:{name = @"SIGVTALRM";}break;case SIGPROF:{name = @"SIGPROF";}break;#ifdef SIGWINCHcase SIGWINCH:{name = @"SIGWINCH";}break;#endif#ifdef SIGINFOcase SIGINFO:{name = @"SIGINFO";}break;#endifcase SIGUSR1:{name = @"SIGUSR1";}break;case SIGUSR2:{name = @"SIGUSR2";}break;default:{}break;}NSArray *callStackSymbols = [NSThread callStackSymbols];NSString *date = [LLTool stringFromDate:[NSDate date]];NSDictionary *appInfos = [LLRoute dynamicAppInfos];LLCrashSignalModel *signalModel = [[LLCrashSignalModel alloc] initWithName:name stackSymbols:callStackSymbols date:date userIdentity:[LLConfig sharedConfig].userIdentity appInfos:appInfos];if ([LLCrashHelper sharedHelper].crashModel) {[[LLCrashHelper sharedHelper].crashModel updateAppInfos:[LLRoute appInfos]];[[LLCrashHelper sharedHelper].crashModel appendSignalModel:signalModel];[[LLStorageManager sharedManager] updateModel:[LLCrashHelper sharedHelper].crashModel complete:^(BOOL result) {NSLog(@"Save signal model success");} synchronous:YES];} else {LLCrashModel *model = [[LLCrashModel alloc] initWithName:signalModel.name reason:@"Catch Signal" userInfo:nil stackSymbols:callStackSymbols date:date userIdentity:[LLConfig sharedConfig].userIdentity appInfos:[LLRoute appInfos] launchDate:[NSObject LL_launchDate]];[model appendSignalModel:signalModel];[LLCrashHelper sharedHelper].crashModel = model;[[LLStorageManager sharedManager] saveModel:model complete:^(BOOL result) {NSLog(@"Save signal model success");} synchronous:YES];}//将crash的有用信息转换成字典NSDictionary *crashInfo = [NSDictionary dictionaryWithObjectsAndKeys:name, @"name",@"Catch Signal",@"reason",callStackSymbols,@"stack",nil] ;[[LLDebugTool sharedTool] uploadBugWithDict:crashInfo exceptionType:CRASH files:nil takeScreenshot:NO complete:^(BOOL result,NSString* zipPath) {if(result){NSLog(@"上传bug成功");[[NSFileManager defaultManager] removeItemAtPath:zipPath error:nil];};} synchronous:YES] ;}

参考文章:

1、/articles/22765

2、/p/1b804426d212

3、/blog/-08-29-iosyi-chang-bu-huo.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。