当前位置: 首页 > news >正文

asp网站后台无法编辑学院网站建设进度情况说明

asp网站后台无法编辑,学院网站建设进度情况说明,太原做网站的公司网站建设,新手要如何让网站被收录摘要#xff1a; 本着探究下iOS Crash捕获的目的#xff0c;学习了下Crash捕获相关的Mach异常和signal信号处理#xff0c;记录下相关内容#xff0c;并提供对应的测试示例代码。Mach为XNU的微内核#xff0c;Mach异常为最底层的内核级异常#xff0c;在iOS系统中#x…摘要 本着探究下iOS Crash捕获的目的学习了下Crash捕获相关的Mach异常和signal信号处理记录下相关内容并提供对应的测试示例代码。Mach为XNU的微内核Mach异常为最底层的内核级异常在iOS系统中底层Crash先触发Mach异常然后再转换为对应的signal信号。 作者阿里云-移动云-大前端团队 原文链接http://click.aliyun.com/m/43672/ 本着探究下iOS Crash捕获的目的学习了下Crash捕获相关的Mach异常和signal信号处理记录下相关内容并提供对应的测试示例代码。Mach为XNU的微内核Mach异常为最底层的内核级异常在iOS系统中底层Crash先触发Mach异常然后再转换为对应的signal信号。 1. iOS Mach异常 1.1 XNU Darwin是Mac OS和iOS的操作系统而XNU是Darwin操作系统的内核部分。XNU是混合内核兼具宏内核和微内核的特性而Mach即为其微内核。Darwin操作系统和MacOS、iOS系统版本号的对应如上图所示Mac可执行下述命令查看Darwin版本号。 system_profiler SPSoftwareDataType 1.2 Mach Mach:[mʌk]操作系统微内核是许多新操作系统的设计基础。 Mach微内核中有几个基础概念 Tasks拥有一组系统资源的对象允许”thread”在其中执行。 Threads执行的基本单位拥有task的上下文并共享其资源。 Portstask之间通讯的一组受保护的消息队列task可对任何port发送/接收数据。 Message有类型的数据对象集合只可以发送到port。 1.3 模拟Mach Message发送 Mach提供少量API苹果文档介绍较少。 // 内核中创建一个消息队列获取对应的port mach_port_allocate(); // 授予task对port的指定权限 mach_port_insert_right(); // 通过设定参数MACH_RSV_MSG/MACH_SEND_MSG用于接收/发送mach message mach_msg(); 下述代码模拟向Mach Port发送Message接收Message后做处理 首先调用createPortAndAddListener创建Mach Port 调用sendMachPortMessage:向已创建的Mach Port发送消息 执行结果示例 2018-02-27 09:33:37.7974350800 xxx[54456:5198921] create a port: 41731 2018-02-27 09:33:37.7976970800 xxx[54456:5198921] Send a mach message: [100]. 2018-02-27 09:33:37.7978700800 xxx[54456:5199525] Receive a mach message:[100], remote_port: 0, local_port: 41731, exception code: 28672 示例代码 // 创建Mach Port并监听消息(mach_port_t)createPortAndAddListener {mach_port_t server_port;kern_return_t kr mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, server_port);assert(kr KERN_SUCCESS);NSLog(create a port: %d, server_port);kr mach_port_insert_right(mach_task_self(), server_port, server_port, MACH_MSG_TYPE_MAKE_SEND);assert(kr KERN_SUCCESS);[self setMachPortListener:server_port];return server_port; } (void)setMachPortListener:(mach_port_t)mach_port {dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{mach_message mach_message;mach_message.Head.msgh_size 1024;mach_message.Head.msgh_local_port server_port;mach_msg_return_t mr;while (true) {mr mach_msg(mach_message.Head,MACH_RCV_MSG | MACH_RCV_LARGE,0,mach_message.Head.msgh_size,mach_message.Head.msgh_local_port,MACH_MSG_TIMEOUT_NONE,MACH_PORT_NULL);if (mr ! MACH_MSG_SUCCESS mr ! MACH_RCV_TOO_LARGE) {NSLog(error!);}mach_msg_id_t msg_id mach_message.Head.msgh_id;mach_port_t remote_port mach_message.Head.msgh_remote_port;mach_port_t local_port mach_message.Head.msgh_local_port;NSLog(Receive a mach message:[%d], remote_port: %d, local_port: %d, exception code: %d,msg_id,remote_port,local_port,mach_message.exception);abort();}}); }// 向指定Mach Port发送消息(void)sendMachPortMessage:(mach_port_t)mach_port {kern_return_t kr;mach_msg_header_t header;header.msgh_bits MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0);header.msgh_size sizeof(mach_msg_header_t);header.msgh_remote_port mach_port;header.msgh_local_port MACH_PORT_NULL;header.msgh_id 100;NSLog(Send a mach message: [%d]., header.msgh_id);kr mach_msg(header,MACH_SEND_MSG,header.msgh_size,0,MACH_PORT_NULL,MACH_MSG_TIMEOUT_NONE,MACH_PORT_NULL); } 1.4 捕获Mach异常 task_set_exception_ports()设置内核接收Mach异常消息的Port替换为自定义的Port后即可捕获程序执行过程中产生的异常消息。 执行结果示例 2018-02-27 09:52:11.4830760800 xxx[55018:5253531] create a port: 23299 2018-02-27 09:52:14.4842720800 xxx[55018:5253531] ********** Make a [BAD MEM ACCESS] now. ********** 2018-02-27 09:52:14.4844770800 xxx[55018:5253611] Receive a mach message:[2405], remote_port: 23555, local_port: 23299, exception code: 1 示例代码(void)createAndSetExceptionPort {mach_port_t server_port;kern_return_t kr mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, server_port);assert(kr KERN_SUCCESS);NSLog(create a port: %d, server_port);kr mach_port_insert_right(mach_task_self(), server_port, server_port, MACH_MSG_TYPE_MAKE_SEND);assert(kr KERN_SUCCESS);kr task_set_exception_ports(mach_task_self(), EXC_MASK_BAD_ACCESS | EXC_MASK_CRASH, server_port, EXCEPTION_DEFAULT | MACH_EXCEPTION_CODES, THREAD_STATE_NONE);[self setMachPortListener:server_port]; }// 构造BAD MEM ACCESS Crash - (void)makeCrash {NSLog(********** Make a [BAD MEM ACCESS] now. **********);*((int *)(0x1234)) 122; } 1.5 Runloop Mach Port的应用不止于内核级别在Cocoa Foundation和Core Foundation层同样有其应用比如说Runloop。Runloop sources分两类 Input sources Port-Based sources Custom Input sources Timer sources 其中Port-Based sources即基于Mach Port在Runloop中完成消息传递。 上述的Mach API为内核层透出接口Cocoa Foundation和Core Foundation层分别封装了Mach Port的接口供调用参考Apple - Runloop Programming Guard有详细的示例代码。 2. signal信号 signal是一种软中断信号提供异步事件处理机制。signal是进程间相互传递信息的一种粗糙方法使用场景 进程终止相关 终端交互 编程错误或硬件错误相关系统遇到不可恢复的错误时触发崩溃机制让程序退出比如除0、内存写入错误等。 这里我们主要考虑系统遇到不可恢复的错误时即Crash时信号相关的应用。signal信号处理是UNIX操作系统机制所以Android平台理论上也是使用的可以基于signal来捕获Android Native Crash。 2.1 signal注册和处理 signal()#import sys/signal.h 注册signal handler 调用成功时会移除signo信号当前的操作以handler指定的新信号处理程序替代 信号处理函数返回void因为没有地方给该函数返回。 注册自定义信号处理函数构造Crash后发出信号并执行自定义信号处理逻辑。 【附】Xcode Debug运行时添加断点在Crash触发前执行pro hand -p true -s false SIGABRT命令。 (lldb) pro hand -p true -s false SIGABRT NAME PASS STOP NOTIFYSIGABRT true false true 2018-02-27 12:57:25.2846510800 xxx[58061:5651844] ********** Make a NSRangeException now. ********** 2018-02-27 12:57:25.2949450800 xxx[58061:5651844] *** Terminating app due to uncaught exception NSRangeException, reason: *** -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0] 2018-02-27 12:57:25.8883320800 xxx[58061:5651844] [signal handler] - handle signal: 6 示例代码 // 设置自定义信号处理函数(void)setSignalHandler {signal(SIGABRT, test_signal_handler); }static void test_signal_handler(int signo) {NSLog([signal handler] - handle signal: %d, signo); }// 构造NSRangeException异常触发SIGABRT信号发送 - (void)makeCrash {NSLog(********** Make a NSRangeException now. **********);NSArray *array [ aaa ]; } 2.2 LLDB Debugger Xcode Debug模式运行App时App进程signal被LLDB Debugger调试器捕获需要使用LLDB调试命令将指定signal处理抛到用户层处理方便调试。 查看全部信号传递配置 // process handle缩写 pro hand 修改指定信号传递配置 // option: // -P: PASS // -S: STOP // -N: NOTIFY pro hand -option false 信号名// 例SIGABRT信号处理在LLDB不停止可继续抛到用户层 pro hand -s false SIGABRT 2.3 可重入 向内核发送信号时进程可能执行到代码的任意位置例进程在执行重要操作中断后可能产生不一致状态或进程正在处理另一信号。因此要确保信号处理程序只执行可重入操作 写中断处理程序时假定中断进程可能处于不可重入函数中。 慎重修改全局数据。 2.4 高级信号处理 signal()函数非常基础只提供了最低限度的信号管理的标准。而sigaction()系统调用提供更强大的信号管理能力。当信号处理程序运行时可以用来阻塞特定信号的接收也可以用来获取信号发送时各种操作系统和进程状态的信息。 示例代码 // 设置自定义信号处理函数(void)setSignalHandlerInAdvance {struct sigaction act;// 当sa_flags设为SA_SIGINFO时设定sa_sigaction来指定信号处理函数act.sa_flags SA_SIGINFO;act.sa_sigaction test_signal_action_handler;sigaction(SIGABRT, act, NULL); }static void test_signal_action_handler(int signo, siginfo_t *si, void *ucontext) {NSLog([sigaction handler] - handle signal: %d, signo);// handle siginfo_tNSLog(siginfo: {\n si_signo: %d,\n si_errno: %d,\n si_code: %d,\n si_pid: %d,\n si_uid: %d,\n si_status: %d,\n si_value: %d\n },si-si_signo,si-si_errno,si-si_code,si-si_pid,si-si_uid,si-si_status,si-si_value.sival_int); } 3. 参考 Apple - Understanding and Analyzing Application Crash Reports Apple - Runloop Programming Guard Apple - Mach Overview 漫谈iOS Crash收集框架 The LLDB Debugger 识别以下二维码干货
http://wiki.neutronadmin.com/news/296507/

相关文章:

  • 郑州小程序开发外包公司什么是seo是什么意思
  • 公司网站建设 上海前端app开发流程
  • 网站开发工作简历高端网站设计报价表
  • 做网站自适应框架易烊千玺网页设计模板
  • 网站名称注册保护长春火车站有几个
  • 硅胶模具技术支持东莞网站建设查企业的信息在哪个官网
  • 网站设计公司网标识设计厂家
  • pc端网站优缺点wordpress表单位插件
  • 个人公众号做电影网站吗网页搭建app
  • 安徽建设厅官方网站163 com邮箱注册
  • wordpress一键仿站做三个月网站广告收入
  • 企业建设网站的必要性母婴类网站怎么建设
  • 网站平台搭建包括哪些wordpress加图片
  • 网站建设合同的性质wordpress判断登录
  • 网站之家开源建站工具
  • 无锡建站方案dedecms 调用网站内部搜索
  • 河北邢台wap网站建设秦皇岛建设路小学网站
  • 网站项目有需要什么技术支持wordpress 弹出视频播放
  • 网站对于企业的海淀深圳网站建设公司
  • 免费制作网页网站重庆网站开发建设
  • seo查询5118长沙网站排名优化报价
  • 两学一做网站安徽省宁波网站建设培训
  • 南宁网站怎么做seo零基础 网站
  • 网站建设和钱下载网站怎么下载
  • 万网虚拟主机上传网站企业网站推广服务协议
  • 网站建设讲解材料购物类网站都有哪些模块
  • e通网网站建设南宁公司网站建设
  • 宁波网站推广代运营优秀网站特点
  • 上海外贸soho网站建设小蚁人网站建设
  • 潍坊专业做网站公司做营销型网站的教程