1.前言  

 
 前几天我们项目闪退之后遇到的一个Crash,之后逛了许多论坛,博客都没有找到满意的回复
 在自己做了深入的研究之后,对iOS的看门狗机制有了一个基本的了解
 而有很多奇怪的Crash可能恰恰就是因为iOS的看门狗机制导致的
 今天分享出来,希望能帮助到后来者,下面我们先来看看Crash Report
 

2. iOS App Crash Report 分析

Date/Time: 2016-01-25 12:19:48.746 +0100
Launch Time: 2016-01-22 15:12:37.422 +0100
OS Version: iOS 8.4 (12H143)
Report Version: 105 Exception Type: 00000020
Exception Codes: 0x000000008badf00d
Highlighted Thread: 0 Application Specific Information:
<BKNewProcess: 0x12cd26cf0; com.scasy.Dinnn; pid: 248; hostpid: -1> has active assertions beyond permitted time:
{(
<BKProcessAssertion: 0x12ce1b400> id: 248-C89C6FAD-B496-46ED-B59A-20D976A02D10 name: Called by ExternalAccessory, from <redacted> process: <BKNewProcess: 0x12cd26cf0; com.scasy.Dinnn; pid: 248; hostpid: -1> permittedBackgroundDuration: 180.000000 reason: finishTask owner pid:248 preventSuspend preventIdleSleep preventSuspendOnSleep
)} Elapsed total CPU time (seconds): 0.130 (user 0.130, system 0.000), 1% CPU
Elapsed application CPU time (seconds): 0.044, 0% CPU Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0:
0 libsystem_kernel.dylib 0x342ec474 mach_msg_trap + 20
1 libsystem_kernel.dylib 0x342ec269 mach_msg + 37
2 CoreFoundation 0x25a1256f __CFRunLoopServiceMachPort + 143
3 CoreFoundation 0x25a10b15 __CFRunLoopRun + 1013
4 CoreFoundation 0x2595d1fd CFRunLoopRunSpecific + 473
5 CoreFoundation 0x2595d00f CFRunLoopRunInMode + 103
6 Foundation 0x266c7139 -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 261
7 Foundation 0x26715221 -[NSRunLoop(NSRunLoop) run] + 77
8 Dinnn 0x0014af59 -[ConnectServerViewController updateInitDinnnThread:] (ConnectServerViewController.m:425)
9 Foundation 0x2678c5cb __NSThreadPerformPerform + 383
10 CoreFoundation 0x25a12fad __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 13
11 CoreFoundation 0x25a123bb __CFRunLoopDoSources0 + 215
12 CoreFoundation 0x25a10a21 __CFRunLoopRun + 769
13 CoreFoundation 0x2595d1fd CFRunLoopRunSpecific + 473
14 CoreFoundation 0x2595d00f CFRunLoopRunInMode + 103
15 GraphicsServices 0x2d2d81fd GSEventRunModal + 133
16 UIKit 0x29129a05 UIApplicationMain + 1437
17 Dinnn 0x00088c47 main (main.m:17)
18 libdyld.dylib 0x34235aad start + 1
我们先定位异常类型: Exception Type: 00000020
简而言之,Exception Type: 00000020 意味着你正在做的异步网络在主线程,当连接或运行缓慢,应用程序可以终止iOS。这将随机发生。
 
最常见的原因是在一个网络中的应用程序的看门狗超时崩溃是同步网络的主要线程。
这里有三个因素:
1.同步网络-这是您的网络请求和阻止等待响应的地方。
 
2.主线程-同步网络一般不理想,但它会导致特定问题,如果你在主线程上做的话。请记住,主线程负责运行用户界面。如果你阻塞主线程的任何显着的时间,用户界面变得很迟钝。
 
3.长期超时-如果网络消失了(例如,用户是在火车进入隧道),任何挂起的网络请求不会失败直到超时过期了。大多数网络超时是以分钟计算,即阻塞同步网络请求在主线程可以同时保持用户界面的响应时间。
 
试图通过减少网络超时来避免这个问题是一个不好的想法。在某些情况下,它可以采取许多秒的网络请求成功,如果你总是提前时间,那么你永远不会取得任何进展。
 
看门狗-为了保持用户界面的响应,iOS系统包括一个看门狗机制。如果您的应用程序未能响应某些用户界面事件(启动、暂停、恢复、终止)的时间,该看门狗将杀死您的应用程序,并产生一个看门狗超时崩溃报告。
 
这个问题的一个棘手的方面是,它高度依赖于网络环境。如果你总是在你的办公室里测试你的应用,在你的网络连接是好的,你永远不会看到这种类型的崩溃。然而,一旦你开始部署你的应用程序,最终用户谁会运行在各种网络环境崩溃,像这样。
 
总结,如果您在主线程上进行同步联网呼叫,您的应用程序将受到看门狗超时崩溃,当它部署到一个广泛的环境。
 
从上面的Crash report中的
6,7,行我们能看到具体原因, 8 行 我们可以看到具体位置。
 
具体:
 
关于-(BOOL)runMode:(NSString *)mode beforeDate:(NSDate *)date;方法
指定runloop模式来处理输入源,首个输入源或date结束退出。
暂停当前处理的流程,转而处理其他输入源,当date设置为[NSDate distantFuture](将来,基本不会到达的时间),所以除非处理其他输入源结束,否则永不退出处理暂停的当前处理的流程。
 
报告里很明显告诉我们这里被堵塞了,说明这个Run loop当前是在主线程上,所以最后我们的APP被iOS的看门狗机制杀死了。
 
 
终:
 
一旦你确认这个问题与你的网络代码相关,有一个共同的解决方案:
异步网络-这个问题的最佳解决方案是异步运行您的网络代码。异步网络代码有很多优点,至少是它可以让你安全地访问网络,而不必担心线程。
 
在辅助线程同步网络如果它运行你的网络代码异步的比登天还难(也许你有一个大的便携式的代码库,假定同步组网工作),你可以通过在辅助线程上运行你的同步码避免看门狗。
 
如何异步运行网络代码,包括多线程这个你可以查看Apple文档相关资料
关于iOS看门机制还有什么不懂欢迎留言。
 
作者: 清澈Saup
出处:http://www.cnblogs.com/qingche/
本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接。
 
 
 
 

iOS- Exception Type: 00000020:什么是看门狗机制的更多相关文章

  1. iOS- Exception Type: 00000020:什么是看门狗机制(转)

    1.前言    前几天我们项目闪退之后遇到的一个Crash,之后逛了许多论坛,博客都没有找到满意的回复  在自己做了深入的研究之后,对iOS的看门狗机制有了一个基本的了解  而有很多奇怪的Crash可 ...

  2. ESP32-任务看门狗笔记

    看门狗机制用于监控嵌入式系统运行并在发生不可知的软硬件故障时将系统复位.系统正常运行时,看门狗定时器溢出之前会被重置计数值,也就是"喂狗".定时器溢出意味着无法"喂狗&q ...

  3. 嵌入式 uboot以及kernel添加看门狗临时记录(个人记录未整理乱)

    Uboot_Kernerl_Add_Watch_Dog: U-Boot 2010.06 (Nov 01 2013 - 15:28:44) DRAM:  128 MiBCheck spi flash c ...

  4. Cubieboard2裸机开发之(五)看门狗操作

    前言 说到看门狗,应该不会陌生,看门狗说白了就是一个定时器,但是它有一个非常重要的功能就是复位系统.在A20里,看门狗的操作非常简单,只有两个寄存器,不需要操作时钟相关的东西,系统起来后可以直接使用, ...

  5. S3C3440看门狗驱动程序

    S3C3440看门狗驱动程序 http://www.cnblogs.com/lfsblack/archive/2012/09/13/2684079.html 看门狗是当CPU进入错误状态后,无法恢复的 ...

  6. RTT设备驱动之看门狗

    看门狗的喂狗一般放在空闲任务钩子函数里面. rt_thread_idle_sethook(idle_hook); static void idle_hook(void) { /* 在空闲线程的回调函数 ...

  7. Spring Boot 实现看门狗功能 (调用 Shell 脚本)

    需要实现看门狗功能,定时检测另外一个程序是否在运行,使用 crontab 仅可以实现检测程序是否正在运行,无法做到扩展,如:手动重启.程序升级(如果只需要实现自动升级功能可以使用 inotify)等功 ...

  8. STM32之看门狗(独立与窗口)

    广大的互联网网友们,大家早上中午晚上好,我是某某某..对于狗..看过<忠犬八公>的我.无不深深的被狗的义气与灵气所震撼..我也觉得在所有mcu中用看门狗来形容让系统复位的功能是很恰当的.也 ...

  9. (学)解决诡异的 Exception type: SocketException 127.0.0.1:80

    许久不发博了,老杨听完故事让我持续写一下“十万个为什么” 一.背景:  昨天我们亲密的战友HH刘老板亲临现场,指出我们协用的一个项目,客户方面反馈手持终端系统不定期“卡死”,要我们安排人飞到广州驻场解 ...

随机推荐

  1. 异步fifo with 读控制

    之前做LDPC编码器时,学习了一下异步FIFO的相关知识,主要参考了http://www.cnblogs.com/aslmer/p/6114216.html,并在此基础上根据项目需求,添加了一个读控制 ...

  2. JavaWeb基础—Servlet重要对象

    一.ServletConfig对象 当servlet配置了初始化参数后(<init-param> <param-name> <param-value>),web容器 ...

  3. FSCapture注册码

    企业版序列号: name:bluman serial/序列号/注册码:VPISCJULXUFGDDXYAUYF

  4. plsql分页

    分页是任何一个网站(bbs,网上商城,blog)都会使用到的技术,因此学习pl/sql编程开发就一定要掌握该技术.如下图: 1.  编写无返回值的存储过程 首先是掌握最简单的存储过程,无返回值的存储过 ...

  5. 2015539平措卓玛课堂测试(ch06)

    课堂测试(ch06) 1.下面代码中,对数组x填充后,采用直接映射高速缓存,所有对x和y引用的命中率为(D) A .1 B .1/4 C .1/2 D .3/4 解析:缓存命中:当程序需要第(k+1) ...

  6. 2597: [Wc2007]剪刀石头布

    2597: [Wc2007]剪刀石头布 链接 分析: 费用流. 首先转化一下问题,整张图最优的情况是存在$C_n^3$个,即任意3个都行,然后考虑去掉最少不满足的三元环. 如果u赢了v,u向v连一条边 ...

  7. Spring MVC的Rest URL 被错误解析成jsp, 导致404错误(XML方式下@Controller和@RestController需要配置<mvc:annotation-driving/>)

    问题: 最近在原有MVC的WEB应用中添加一个REST服务,结果始终报404错误.把 Spring debug 日志打开,发现处理REST请求的Controller已经正确进入 [org.spring ...

  8. idea中xml打开方式变成file,改回来

    原文:https://blog.csdn.net/u012903926/article/details/80682885 创建了一个test文件,用的是普通text打开方式,然后你修改文件为test. ...

  9. Spring学习----- Spring配置文件xml文档的schema约束

    1.配置文件示例. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="htt ...

  10. 「专题训练」Collecting Bugs(POJ-2096)

    题意与分析 题意大致是这样的:给定一个\(n\times s\)的矩阵,每次可以随机的在这个矩阵内给一个格子染色(染过色的仍然可能被选中),问每一行和每一列都有格子被染色的次数的期望. 这题如果从概率 ...