@synchronized(self) 加锁引起的Crash
一、最近米家App进入前台的时候上报上来一个Crash
{"app_name":"MiHome","timestamp":"2019-04-03 11:00:09.66 +0800","app_version":"4.15.101","slice_uuid":"d41578a2-af0f-3fc5-b202-c120aeaacba2","adam_id":0,"build_version":"4.15.101.1334","bundleID":"com.xiaomi.mihome.dailybuild","share_with_app_devs":false,"is_first_party":false,"bug_type":"109","os_version":"iPhone OS 12.1 (16B92)","incident_id":"0DD1416C-EFFC-45CC-A5B1-7099FD5582E1","name":"MiHome"}
Incident Identifier: 0DD1416C-EFFC-45CC-A5B1-7099FD5582E1
CrashReporter Key: 0d34987d160e2a213f0eea4224c7be37b0e5f7ff
Hardware Model: iPhone10,2
Process: MiHome [12041]
Path: /private/var/containers/Bundle/Application/C164FC42-7011-4900-B31D-C1FBF97A4927/MiHome.app/MiHome
Identifier: com.xiaomi.mihome.dailybuild
Version: 4.15.101.1334 (4.15.101)
AppStoreTools: 10B61
Code Type: ARM-64 (Native)
Role: Non UI
Parent Process: launchd [1]
Coalition: com.xiaomi.mihome.dailybuild [15486] Date/Time: 2019-04-03 11:00:09.4286 +0800
Launch Time: 2019-04-03 10:56:55.4746 +0800
OS Version: iPhone OS 12.1 (16B92)
Baseband Version: 3.11.00
Report Version: 104 Exception Type: EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Termination Reason: Namespace SPRINGBOARD, Code 0x8badf00d
Termination Description: SPRINGBOARD, scene-update watchdog transgression: com.xiaomi.mihome.dailybuild exhausted real (wall clock) time allowance of 10.00 seconds | ProcessVisibility: Foreground | ProcessState: Running | WatchdogEvent: scene-update | WatchdogVisibility: Foreground | WatchdogCPUStatistics: ( | "Elapsed total CPU time (seconds): 3.890 (user 3.890, system 0.000), 6% CPU", | "Elapsed application CPU time (seconds): 0.695, 1% CPU" | )
Triggered by Thread: 0 Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x00000001c97a79fc __ulock_wait + 8
1 libsystem_platform.dylib 0x00000001c981b8f8 _os_unfair_lock_lock_slow + 172
2 libobjc.A.dylib 0x00000001c8df4830 objc_sync_enter + 32
3 MiHome 0x00000001035add48 -[MHTutkIotcManager registerNotifDictString] + 22076744 (MHTutkIotcManager.m:286)
4 MiHome 0x00000001035ad654 -[MHTutkIotcManager appEnterForeground:] + 22074964 (MHTutkIotcManager.m:241)
5 MiHome 0x0000000104b22c8c __43-[MHNotificationCenter processNotificaton:]_block_invoke + 44575884 (MHNotificationCenter.m:162)
6 CoreFoundation 0x00000001c9af56bc -[__NSArrayM enumerateObjectsWithOptions:usingBlock:] + 216
7 MiHome 0x0000000104b22b6c -[MHNotificationCenter processNotificaton:] + 44575596 (MHNotificationCenter.m:164)
8 CoreFoundation 0x00000001c9b7e928 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 20
9 CoreFoundation 0x00000001c9b7e8f4 ___CFXRegistrationPost_block_invoke + 64
10 CoreFoundation 0x00000001c9b7dde4 _CFXRegistrationPost + 392
11 CoreFoundation 0x00000001c9b7da90 ___CFXNotificationPost_block_invoke + 96
12 CoreFoundation 0x00000001c9af5d70 -[_CFXNotificationRegistrar find:object:observer:enumerator:] + 1404
13 CoreFoundation 0x00000001c9b7d51c _CFXNotificationPost + 696
14 Foundation 0x00000001ca58dc10 -[NSNotificationCenter postNotificationName:object:userInfo:] + 68
15 UIKitCore 0x00000001f6e29c30 -[UIApplication _sendWillEnterForegroundCallbacks] + 232
16 UIKitCore 0x00000001f66abdc4 -[__UICanvasLifecycleMonitor_Compatability activateEventsOnly:withContext:completion:] + 2180
17 UIKitCore 0x00000001f66a9a74 __82-[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:]_block_invoke + 772
18 UIKitCore 0x00000001f66a9720 -[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:] + 432
19 UIKitCore 0x00000001f66ae8e0 __125-[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:]_block_invoke + 220
20 UIKitCore 0x00000001f66af840 _performActionsWithDelayForTransitionContext + 112
21 UIKitCore 0x00000001f66ae798 -[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:] + 248
22 UIKitCore 0x00000001f66b3684 -[_UICanvas scene:didUpdateWithDiff:transitionContext:completion:] + 368
23 UIKitCore 0x00000001f69f7090 -[UIApplicationSceneClientAgent scene:handleEvent:withCompletion:] + 468
24 FrontBoardServices 0x00000001cc6456e4 __80-[FBSSceneImpl updater:didUpdateSettings:withDiff:transitionContext:completion:]_block_invoke.359 + 228
25 libdispatch.dylib 0x00000001c964a484 _dispatch_client_callout + 16
26 libdispatch.dylib 0x00000001c96213f0 _dispatch_block_invoke_direct$VARIANT$armv81 + 216
27 FrontBoardServices 0x00000001cc683a9c __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 40
28 FrontBoardServices 0x00000001cc683728 -[FBSSerialQueue _performNext] + 416
29 FrontBoardServices 0x00000001cc683d44 -[FBSSerialQueue _performNextFromRunLoopSource] + 56
30 CoreFoundation 0x00000001c9ba01cc __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
31 CoreFoundation 0x00000001c9ba014c __CFRunLoopDoSource0 + 88
32 CoreFoundation 0x00000001c9b9fa30 __CFRunLoopDoSources0 + 176
33 CoreFoundation 0x00000001c9b9a8fc __CFRunLoopRun + 1040
34 CoreFoundation 0x00000001c9b9a1cc CFRunLoopRunSpecific + 436
35 GraphicsServices 0x00000001cbe11584 GSEventRunModal + 100
36 UIKitCore 0x00000001f6e11054 UIApplicationMain + 212
37 MiHome 0x00000001026e9a00 main + 6593024 (main.m:19)
38 libdyld.dylib 0x00000001c965abb4 start + 4 Thread 28 name: Dispatch queue: com.apple.root.default-qos
Thread 28:
0 libsystem_kernel.dylib 0x00000001c97a7428 __semwait_signal + 8
1 libsystem_c.dylib 0x00000001c971c5d0 nanosleep + 212
2 libsystem_c.dylib 0x00000001c971c4a4 usleep + 64
3 MiHome 0x00000001027a1d50 IOTC_Connect_UDP + 7347536 (UDP_Connect.c:2410)
4 MiHome 0x00000001035ac59c -[MHTutkIotcManager mh_iotcConnectByUIDParallel:uId:sId:] + 22070684 (MHTutkIotcManager.m:129)
5 MiHome 0x00000001035b28d0 __63-[MHTUTKP2PConnection connectIOTCDeviceWithUId:did:completion:]_block_invoke + 22096080 (MHTUTKP2PConnection.m:533)
6 libdispatch.dylib 0x00000001c96496c8 _dispatch_call_block_and_release + 24
7 libdispatch.dylib 0x00000001c964a484 _dispatch_client_callout + 16
8 libdispatch.dylib 0x00000001c9620a7c _dispatch_queue_override_invoke + 664
9 libdispatch.dylib 0x00000001c962cafc _dispatch_root_queue_drain + 344
10 libdispatch.dylib 0x00000001c962d35c _dispatch_worker_thread2 + 116
11 libsystem_pthread.dylib 0x00000001c982c17c _pthread_wqthread + 472
12 libsystem_pthread.dylib 0x00000001c982ecec start_wqthread + 4
从Crash类型可以查询出来,Termination Reason: Namespace SPRINGBOARD, Code 0x8badf00d 代表主线程无响应,被watchdog杀掉了
主线程被阻塞,无非几种原因、死锁,方法执行耗时过长。
查询主线程,确实发现@synchronized(self) 加锁了,并且也是等锁导致等时间过长。子线程等方法中 使用了@synchronized加锁,内部操作长时间不返回,导致主线程被阻塞。
总结:
所有关于加锁的,一定要考虑加锁的粒度,同时考虑等锁等是不是主线程。
耗时过长的操作,设计线程安全的,可以放在队列中,使用队列解决。
@synchronized(self) 加锁引起的Crash的更多相关文章
- java多线程(五)-访问共享资源以及加锁机制(synchronized,lock,voliate)
对于单线程的顺序编程而言,每次只做一件事情,其享有的资源不会产生什么冲突,但是对于多线程编程,这就是一个重要问题了,比如打印机的打印工作,如果两个线程都同时进行打印工作,那这就会产生混乱了.再比如说, ...
- 重大发现,AQS加锁机制竟然跟Synchronized有惊人的相似
在并发多线程的情况下,为了保证数据安全性,一般我们会对数据进行加锁,通常使用Synchronized或者ReentrantLock同步锁.Synchronized是基于JVM实现,而Reentrant ...
- java中的synchronized关键字
参考:http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html 多线程并发问题的根因: 在一个对象中有一个变量i=0,有两个线 ...
- (转)Synchronized(对象锁)和Static Synchronized(类锁)的区别
场景:面试的时候经常用得到! 1 综述 Synchronized和Static Synchronized区别 一个是实例锁(锁在某一个实例对象上,如果该类是单例,那么该锁也具有全局锁的概念),一个是全 ...
- 线程池 队列 synchronized
线程池 BlockingQueue synchronized volatile 本章从线程池到阻塞队列BlockingQueue.从BlockingQueue到synchronized 和 volat ...
- Java 多线程加锁的方式总结及对比(转载)
转自https://blog.csdn.net/u010842515/article/details/67634813 参考博文:http://www.cnblogs.com/handsomeye/p ...
- synchronized底层实现学习
上文我们总结了 synchronized 关键字的基本用法以及作用,并未涉及 synchronized 底层是如何实现的,所谓刨根问底,本文我们就开始 synchronized 原理的探索之旅吧(*& ...
- iOS 加锁的方式
iOS多线程编程中,经常碰到多个线程访问共同的一个资源,在线程相互交互的情况下,需要一些同步措施,来保证线程之间交互的时候是安全的.下面我们一起看一下学一下iOS的几种常用的加锁方式,希望对大家有所帮 ...
- 从线程池到synchronized关键字详解
线程池 BlockingQueue synchronized volatile 前段时间看了一篇关于"一名3年工作经验的程序员应该具备的技能"文章,倍受打击.很多熟悉而又陌生的知识 ...
- Java锁机制(一)synchronized
进行多线程编程的时候,需要考虑的是线程间的同步问题.对于共享的资源,需要进行互斥的访问.在Java中可以使用一些手段来达到线程同步的目的: 1. synchronized 2. ThreadLocal ...
随机推荐
- 重新点亮linux 基本软件————防火墙[一]
前言 简单介绍一下linux的防火墙. 正文 防火墙分类: 软件防火墙和硬件防火墙 包过:过滤防火墙和应用层防火墙 iptables 的表和链 规则表: filter nat mangle raw f ...
- spring boot yaml 配置[三]
前言 我们知道java 因为历史的原因,一直有一个配置地狱的痛点.那么如何解决掉它呢? spring boot 是一柄利器,但是呢,还是要配置. 看来配置的避免不了的了. 那么如何可以减轻这种痛苦呢? ...
- C#判断窗体是否被遮挡 - 开源研究系列文章
上次发布了托盘窗体的显示与隐藏的博文:,但是在测试窗体最大化的时候发现窗体没有隐藏,调试了下知道是窗体是否被遮挡这个函数的判断有问题.于是就研究了该代码,然后联系了该操作类的作者,也是博客园的园友,然 ...
- GaussDB(DWS)基于Flink的实时数仓构建
本文分享自华为云社区<GaussDB(DWS)基于Flink的实时数仓构建>,作者:胡辣汤. 大数据时代,厂商对实时数据分析的诉求越来越强烈,数据分析时效从T+1时效趋向于T+0时效,为了 ...
- 在RockyLinux 9.3环境中采用RPM模式部署Oracle 19C
在RockyLinux 9.3环境中采用RPM模式部署Oracle 19C 用途 在开发数据库系统时,可以验证功能是否与Oracle的表现一致,验证正确性和兼容性 限制 虚拟机安装,CPU 2*4 内 ...
- 力扣1112(MySQL)-每位学生的最高成绩(中等)
题目: 表:Enrollments (student_id, course_id) 是该表的主键. 问题编写一个 SQL 查询,查询每位学生获得的最高成绩和它所对应的科目,若科目成绩并列,取 cour ...
- 暑期集训 Day10 —— 模拟赛复盘
${\color{Green} \mathrm{Problem\ 0 :water }} $ 题如其名,可以用单调队列做,但是数据范围直接暴力枚举每一高度就行. 最不会打错的,还是暴力,所以用暴力. ...
- 深入理解C++中的RVO
前言 考虑存在这样一个类如HeavyObject,其拷贝赋值操作比较耗时,通常你在使用函数返回这个类的一个对象时会习惯使用哪一种方式?或者会根据具体场景选择某一种方式? // style 1 Heav ...
- 基于 Mesh 的统一路由在海外业务的实践
简介:本文主要介绍我们最近在利用 Service Mesh 架构解决海外业务问题中一些实践和价值探索.我们在海外业务引入 Mesh 架构过程中,充分利用 Istio 的基于 yaml 来描述和定义路 ...
- 3月2日,阿里云开源 PolarDB 企业级架构将迎来重磅发布
简介:2022年3月2日,开源 PolarDB 企业级架构将迎来重磅发布!本次发布会将首次公开开源 PolarDB 的总体结构设计和企业级特性,对 PolarDB for PostgreSQL 的存储 ...