iOS 16 UIResponderForwarderWantsForwardingFromResponder Crash问题解决方案

news/2024/10/17 23:24:38/

背景

最近后台统计发现有一个随机的Crash,引起了我们的关注
在这里插入图片描述
从操作系统来看,都是iOS 16+ 系统
在这里插入图片描述
崩溃堆栈如下:

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x00000001daa1808c
Termination Reason: SIGNAL 5 Trace/BPT trap: 5
Terminating Process: exc handler [44398]Triggered by Thread:  0Kernel Triage:
VM - pmap_enter retried due to resource shortage
VM - pmap_enter retried due to resource shortage
VM - pmap_enter retried due to resource shortage
VM - pmap_enter retried due to resource shortage
VM - pmap_enter retried due to resource shortageThread 0 name:
Thread 0 Crashed:
0   libsystem_platform.dylib      	0x00000001daa1808c _os_unfair_lock_recursive_abort + 36 (lock.c:508)
1   libsystem_platform.dylib      	0x00000001daa12898 _os_unfair_lock_lock_slow + 280 (lock.c:567)
2   libobjc.A.dylib               	0x00000001859e28d4 objc_object::rootRetain_overflow(bool) + 112 (objc-object.h:684)
3   CoreFoundation                	0x000000018c83d114 -[__NSDictionaryM __setObject:forKey:] + 352 (NSCollectionAux.h:40)
4   CoreFoundation                	0x000000018c83b0e4 -[__NSFrozenDictionaryM __apply:context:] + 128 (NSDictionaryM_Common.h:247)
5   CoreFoundation                	0x000000018c86bd60 -[CFPrefsSource mergeIntoDictionary:sourceDictionary:cloudKeyEvaluator:] + 168 (CFPrefsSource.m:965)
6   CoreFoundation                	0x000000018c86bbc0 -[CFPrefsSearchListSource alreadylocked_getDictionary:] + 744 (CFPrefsSearchListSource.m:1243)
7   CoreFoundation                	0x000000018c843394 -[CFPrefsSearchListSource alreadylocked_copyValueForKey:] + 172 (CFPrefsSearchListSource.m:639)
8   CoreFoundation                	0x000000018c8432c8 -[CFPrefsSource copyValueForKey:] + 52 (CFPrefsSource.m:894)
9   CoreFoundation                	0x000000018c84327c __76-[_CFXPreferences copyAppValueForKey:identifier:container:configurationURL:]_block_invoke + 32 (CFXPreferences.m:1085)
10  CoreFoundation                	0x000000018c8c3ca4 __108-[_CFXPreferences(SearchListAdditions) withSearchListForIdentifier:container:cloudConfigurationURL:perform:]_block_invoke + 392 (CFPrefsSearchListSource.m:1767)
11  CoreFoundation                	0x000000018c8af878 normalizeQuintuplet + 356 (CFPrefsSearchListSource.m:74)
12  CoreFoundation                	0x000000018c8ac124 -[_CFXPreferences withSearchListForIdentifier:container:cloudConfigurationURL:perform:] + 152 (CFPrefsSearchListSource.m:1639)
13  CoreFoundation                	0x000000018c852d5c -[_CFXPreferences copyAppValueForKey:identifier:container:configurationURL:] + 168 (CFXPreferences.m:1081)
14  CoreFoundation                	0x000000018c852bb4 _CFPreferencesCopyAppValueWithContainerAndConfiguration + 112 (CFXPreferences.m:2160)
15  Foundation                    	0x0000000186ba586c -[NSUserDefaults(NSUserDefaults) objectForKey:] + 60 (NSUserDefaults.m:224)
16  CsdnPlus                      	0x0000000104c1f5ac 0x102ec0000 + 30799276
17  CsdnPlus                      	0x0000000104c842ac 0x102ec0000 + 31212204
18  CsdnPlus                      	0x0000000104c7c920 0x102ec0000 + 31181088
19  CsdnPlus                      	0x0000000104c783c4 0x102ec0000 + 31163332
20  CsdnPlus                      	0x0000000104c7bdcc 0x102ec0000 + 31178188
21  CsdnPlus                      	0x0000000104c79db0 0x102ec0000 + 31169968
22  libsystem_platform.dylib      	0x00000001daa13a90 _sigtramp + 56 (sigtramp.c:116)
23  libsystem_kernel.dylib        	0x00000001ca375bf0 abort_with_payload_wrapper_internal + 104 (terminate_with_reason.c:102)
24  libsystem_kernel.dylib        	0x00000001ca375b88 abort_with_reason + 32 (terminate_with_reason.c:116)
25  libobjc.A.dylib               	0x00000001859e3a5c _objc_fatalv(unsigned long long, unsigned long long, char const*, char*) + 116 (objc-errors.mm:199)
26  libobjc.A.dylib               	0x00000001859e39e8 _objc_fatal(char const*, ...) + 32 (objc-errors.mm:215)
27  libobjc.A.dylib               	0x00000001859b6c24 weak_register_no_lock + 392 (objc-weak.mm:421)
28  libobjc.A.dylib               	0x00000001859bb88c objc_storeWeak + 484 (NSObject.mm:365)
29  UIKitCore                     	0x000000018eb1af2c _UIResponderForwarderWantsForwardingFromResponder + 736 (UITouch.m:185)
30  UIKitCore                     	0x000000018ea307dc __forwardTouchMethod_block_invoke + 44 (UIResponder.m:2168)
31  CoreFoundation                	0x000000018c8313cc __NSSET_IS_CALLING_OUT_TO_A_BLOCK__ + 24 (NSSetHelpers.m:10)
32  CoreFoundation                	0x000000018c8b2264 -[__NSSetM enumerateObjectsWithOptions:usingBlock:] + 200 (NSSetM_Common.h:157)
33  UIKitCore                     	0x000000018ebfddcc forwardTouchMethod + 236 (UIResponder.m:2167)
34  UIKitCore                     	0x000000018eaf81b0 -[UIWindow _sendTouchesForEvent:] + 356 (UIWindow.m:3160)
35  UIKitCore                     	0x000000018eaf7770 -[UIWindow sendEvent:] + 3284 (UIWindow.m:3481)
36  UIKitCore                     	0x000000018eaf6a20 -[UIApplication sendEvent:] + 676 (UIApplication.m:12635)
37  UIKitCore                     	0x000000018eaf60d8 __dispatchPreprocessedEventFromEventQueue + 7084 (UIEventDispatcher.m:2417)
38  UIKitCore                     	0x000000018eb3de00 __processEventQueue + 5632 (UIEventDispatcher.m:2726)
39  UIKitCore                     	0x000000018f79b820 updateCycleEntry + 168 (UIEventDispatcher.m:117)
40  UIKitCore                     	0x000000018f04e5b0 _UIUpdateSequenceRun + 84 (_UIUpdateSequence.mm:112)
41  UIKitCore                     	0x000000018f69d310 schedulerStepScheduledMainSection + 172 (_UIUpdateScheduler.m:987)
42  UIKitCore                     	0x000000018f69c4dc runloopSourceCallback + 92 (_UIUpdateScheduler.m:1079)
43  CoreFoundation                	0x000000018c8fcf24 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 28 (CFRunLoop.c:1957)
44  CoreFoundation                	0x000000018c9092fc __CFRunLoopDoSource0 + 176 (CFRunLoop.c:2001)
45  CoreFoundation                	0x000000018c88d1c0 __CFRunLoopDoSources0 + 244 (CFRunLoop.c:2038)
46  CoreFoundation                	0x000000018c8a2b7c __CFRunLoopRun + 836 (CFRunLoop.c:2953)
47  CoreFoundation                	0x000000018c8a7eb0 CFRunLoopRunSpecific + 612 (CFRunLoop.c:3418)
48  GraphicsServices              	0x00000001c6a9d368 GSEventRunModal + 164 (GSEvent.c:2196)
49  UIKitCore                     	0x000000018ed9d668 -[UIApplication _run] + 888 (UIApplication.m:3758)
50  UIKitCore                     	0x000000018ed9d2cc UIApplicationMain + 340 (UIApplication.m:5348)
51  CsdnPlus                      	0x0000000103650e04 0x102ec0000 + 7933444
52  dyld                          	0x00000001ab1a0960 start + 2528 (dyldMain.cpp:1170)

分析

堆栈

通过崩溃堆栈,我们可以分析出来是一个系统性的Crash,再往下我们定位到了objc-weak.mm:421,查看源码后发现应该是一个过渡释放的问题导致的Crash。
在这里插入图片描述

行为轨迹

从崩溃堆栈我们可以看出来是系统的过渡释放问题导致的,那么需要找到用户的具体行为。才能继续分析。
在这里插入图片描述
在这里插入图片描述
通过用户行为轨迹分析发现,所有的Crash用户都是在点击搜索框的时候出现的Crash,猜测是和输入键盘有关系。

找案例

因为是系统性Crash,我们坚信肯定也有人遇到相同的问题。果然在苹果官方开发者论坛发现了复现方法。
在这里插入图片描述
通过该方法试验,确实能够100%复现该问题。
debug 复现后控制台输出内容如下:
在这里插入图片描述

解决方案

在论坛中,有大牛已经给出了解决方案。将 UIWindow+FixCrashOnInputKeyboard.h/m 拖入项目中即可。
在这里插入图片描述
通过试验,确实解决了该问题。
代码如下:

+ (void)load
{static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{Class class = objc_getClass("UIWindow");SEL originalSelector = @selector(sendEvent:);SEL swizzledSelector = @selector(sendEventEx:);Method originalMethod = class_getInstanceMethod(class, originalSelector);Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);method_exchangeImplementations(originalMethod, swizzledMethod);});
}- (void)sendEventEx:(UIEvent *)event {if ([UIWindow isSendEventToDealloctingObject:event]) {return;}[self sendEventEx: event];
}#pragma mark - check if sending Event to deallocating object
+ (BOOL) isSendEventToDealloctingObject:(UIEvent *)event {if (event.type == UIEventTypeTouches) {for (UITouch *touch in event.allTouches) {NSString *windowName = NSStringFromClass([touch.window class]);if ([windowName isEqualToString:@"UIRemoteKeyboardWindow"]) {UIView* view = touch.view;UIResponder *arg2 = view.nextResponder;NSString* responderClassName = NSStringFromClass([arg2 class]);if ([responderClassName isEqualToString:@"_UIRemoteInputViewController"]) {bool isDeallocating = false;// Use 'performSelector' when u are develop a App-Store App.#pragma clang diagnostic push#pragma clang diagnostic ignored "-Warc-performSelector-leaks"SEL sel = NSSelectorFromString(@"_isDeallocating");isDeallocating = [arg2 respondsToSelector:sel] && [arg2 performSelector:sel];#pragma clang diagnostic popif (isDeallocating) {NSLog(@"UIWindow - BingGo a deallocating object ...");return true;}}}}}return false;
}

http://www.ppmy.cn/news/123306.html

相关文章

Pentest Wiki Part3 渗透工具

渗透测试工具 渗透测试工具 攻击可能是渗透测试中最迷人的部分之一了,但它通常是用暴力破解而不是精确制导来完成的。只有当你知道针对目标的一个特定漏洞很可能会成功的时候,你才应该发起一次攻击。即在利用漏洞之前,您应该知道目标是存在该…

Elasticsearch + Logstash + Kibana 日志分析系统搭建

Elasticsearch Logstash Kibana 日志分析系统搭建 一、简介1.1 Elasticsearch、Logstash 和 Kibana 简介1.2 日志分析系统的意义 二、日志分析系统技术架构2.1 Logstash2.2 Elasticsearch2.3 Kibana 三、环境搭建3.1 下载安装 Elasticsearch Logstash Kibana3.1.1 Elasticsea…

[Mysql_DB]自动写入系统时间——注意低版本数据库操作

创建商品表包含字段create_time和update_time,并设置默认值为当前时间 实例 使用 CREATE TABLE 语句来创建一个商品表,并为其添加 create_time 和 update_time 字段,同时将这两个字段的默认值设置为当前时间。以下是一个示例: CREATE TABLE …

苹果iPhone14如何批量删除联系人?iPhone 14批量删除联系人方法

苹果iPhone 14如何批量删除联系人?手动一个个删实在太麻烦了! 苹果iPhone 14手机的通讯录本身不支持批量删除联系人,但是如果通讯录在iCloud中开启过备份,就可以对联系人进行批量操作。 需要注意的是,iPhone 14手机端…

webpack-SplitChunksPlugin学习

前言 Webpack 默认会将尽可能多的模块代码打包在一起,优点是能减少最终页面的 HTTP 请求数,但缺点也很明显: 1 页面初始代码包过大,影响首屏渲染性能;2 无法有效应用浏览器缓存,特别对于 NPM 包这类变动较…

vr报价单_七里河区vr全景展示报价表

七里河区vr全景展示报价表 VR现实创新实验室综合解决方案是一款为学校、校外教育基地设计开发的软硬件一体化产品,通过现实技术,满足青少年自主探索、安全实验的vr现实实验创新教学的需求。 该方案依托国际先进的桌面级便携式一体化现实设备,…

中国移动苏州研发中心暑期实习随行录-1

2019年7月8号 今天是实习报到的第一天,早上从宿舍乘坐班车去公司,宿舍是苏小研租的高博软件学院的一个学生宿舍。宿舍是六人间,但是只住四人,宿舍有空调,热水器,我们都是住在一楼,所以相对来说有…

服务器柜机位置摆放电子图,柜式空调摆放位置有什么要注意的吗

答:根据你的情况,可以放在门后面,斜着往里面(45度角),因为门口是太阳西下,里面应该不是很热,斜着往里面不仅里面保持凉快,门口处也可以当冷气帘,挡住从外面进来的热气。我的回答希望…