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 https://stackoverflow.com/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、http://www.cocoachina.com/articles/22765
2、https://www.jianshu.com/p/1b804426d212
3、http://www.iosxxx.com/blog/2015-08-29-iosyi-chang-bu-huo.html

软件测试之SDK开发(ios)——signal捕获相关推荐

  1. 三维扫描仪FlexScan3D软件的SDK开发

    很多工业级三维扫描仪采用FlexScan3D的上位机,该方案全部采用双目加结构光的方案,精度在小于0.1mm的范围内,上位机自动采图,自动处理为点云.本文记录了在VS环境下直接调用flexscan3d ...

  2. 软件测试之测试程序开发

    软件测试培训之测试程序开发 脚本维护,测试数据准备,测试监控准备; 测试程序开发 性能测试场景设计和性能测试脚本设计中需要注意以下几个问题: 场景真实性: 每个脚本的具体操作步骤,是和真实环境操作类似 ...

  3. 软件测试之性能测试(ios)——获取fps(流畅度)

    FPS是测量用于保存.显示动态视频的信息数量.通俗来讲就是指动画或视频的画面数.例如在电影视频及数字视频上,每一帧都是静止的图象:快速连续地显示帧便形成了运动的假象.每秒钟帧数 (FPS) 愈多,所显 ...

  4. 一对一直播软件源码开发,iOS视频采集的实现过程

    在一对一直播软件源码日益火热的发展形势下,音视频开发(采集.编解码.传输.播放.美颜)等技术也随之成为开发者们关注的重点,本系列文章就音视频开发过程中所运用到的技术和原理进行梳理和总结. 认识 AVC ...

  5. 直播网站源码直播平台软件开发iOS动手做一个直播(原理篇)

    直播网站源码直播平台软件开发iOS动手做一个直播(原理篇) 上篇文章主要给出了代码,但是并没有详细说明直播相关的知识,这篇文章就说一下直播的相关理论知识.附上直播代码篇地址. ###推流 腾讯直播平台 ...

  6. 华睿相机sdk 开发_索尼发布相机远程操作SDK(软件开发工具包)

    索尼从2020年12月9日开始,向开发者免费提供针对索尼数码相机的软件开发工具包" Camera Remote SDK" 1.03版. " Camera Remote S ...

  7. iOS开发之SDK开发

    转自 https://www.jianshu.com/p/cbb1f54b89d2 内容提要:不同场景下如何封装及开发SDK .a静态库创建 直接创建Framework库 在已有工程中创建 创建Fra ...

  8. 软件开发之SDK开发

    1.SDK与API的区别? SDK包含了API所必须的资料,又提供了一些额外的帮助,目的是为了服务调用方更加方便地调用所需服务.比如,我们现在需要编程,那么电脑就是我们编程所需要地API(applic ...

  9. IOS - swift SDK开发

    IOS - swift SDK 开发 创建私有库 创建私有库 pod lib create 仓库名 根据提示选择自己所需的选项 开发自己的sdk代码,将代码置于classes中 创建远程仓库,关联仓库 ...

最新文章

  1. Android 布局跟着NAVIGATION_BAR 重新布局
  2. 返回值类型与函数类型不匹配_C++返回值类型后置(跟踪返回值类型)
  3. 各种加密算法用法及作用
  4. rw data 、ro data 和 code详解
  5. 任何时候,写下一个类,一定要有三个函数
  6. excel打开2个独立窗口_谢楠称女性独立的不是钱是心 谢楠与吴京婚后生育2个儿子...
  7. RUNOOB python练习题17
  8. $ajax({}).done 和 $ajax({}) success 区别
  9. Win7系统下网站发布IIS配置
  10. 知乎热议的Deep Peak2模型究竟是什么?答案都在这里
  11. php扩展ui,jQuery UI 扩展小部件
  12. 分分钟搞定LabVIEW读取与写入Excel【三易电子工作室】
  13. NoteExpress文献题录如何导出到excel
  14. AS更换背景主题以及背景图片
  15. Cocoa动画编程指南
  16. 实战案例!使用 Python 进行 RFM 客户价值分析!
  17. android 串口 汉字乱码,Arduino软串口出现乱码
  18. 网站系统维护通知美化页面
  19. Java中的函数式编程(二)函数式接口Functional Interface
  20. 仿最新BiliBili客户端开源带后台弹幕库版

热门文章

  1. 翻译德文到中文,北京德文翻译哪家好?
  2. 第一周《人月神话》读书笔记-------黄志鹏
  3. 图片热区自适应和设置热区边框
  4. android专项测试题,Android期末测考试试题(附带答案).doc
  5. 微型断路器的选择使用
  6. excel 拼接字符串公式
  7. Matlab作图如何画多曲线子图,多子图绘图指令subplot
  8. 计算机C P U的概念就是,2008计算机二级考试:C语言基础教程-C语言的特点
  9. DHCP-小结(拓展 网卡文件的配置)
  10. 实现单点登录(伪登录)