iOS 16 UIResponderForwarderWantsForwardingFromResponder Crash问题解决方案

news2024/12/24 8:29:01

背景

最近后台统计发现有一个随机的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:  0


Kernel 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 shortage


Thread 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 pop

                    if (isDeallocating) {
                        NSLog(@"UIWindow - BingGo a deallocating object ...");
                        return true;
                    }
                }
            }
        }
    }
    return false;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/593492.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git推送代码冲突解决

冲突情况一 首先甲和乙同时从远程仓库拉取v1版本的代码,然后乙先修改代码产出v3版本的代码进行提交并且成功,随后甲修改v1版本代码产出v2版本的代码,此时想要提交到origin/master,但是远程的最新版本并不是之前的v1了,这里就产生…

维纳过程和伊藤引理

目录 一、马尔可夫过程(Markov) 1. 基本概念 2. 具体使用 二、维纳过程 1. 基本概念 2. 具体使用 三、广义维纳过程 1. 漂移率和方差率 2. 广义维纳过程的基本概念 3. 具体使用 四、伊藤过程 五、几何布朗运动 六、伊藤引理 1. 基本概念 …

SuperMap Hi-Fi 3D SDK for Unity设置渲染范围

kele 一、背景 在三维项目中经常会使用到大屏,有可能会用到4K屏、8K屏、长屏、带鱼屏等高分辨率的屏幕,这些屏幕的其中一个特点是其长宽比比较大,有些时候会是几块16:9的屏幕横向拼接而成,这就使得这整个屏幕在水平方向…

数字信号处理9:Z变换(1)

说实话,这两天看Z变换看的迷迷糊糊的,就觉得它求卷积的时候好用,再剩下的,我怎么感觉用处不大。 首先来说z变换:,或者简单一点的可以这样子写:,感觉Z变换最重要的一个问题是收敛性,…

2023安卓逆向 -- 某合伙apk登录加密分析

接上节课内容 ​​安卓逆向 -- 抓包环境设置(CharlesPostern)​​ 一、分析登录的数据包,加密的数值是登录的密码,看着想md5加密,请求头中,x-sign也是加密的,看着也像md5。 POST /app/api/v1/partnerLogin/login HT…

2022 Kube-OVN开源社区年度报告

感谢各位社区小伙伴陪伴Kube-OVN又走过了快速发展的一年,随着Kubernetes技术的广泛应用,CNI网络插件的使用率逐步攀升,Kube-OVN社区也在不断成长。让我们一起跟随这篇文章,走进Kube-OVN的2022。 产品功能持续优化 2022年&#xff…

JavaScript高级教程(javascript实战进阶)

javascript高级、面试常问、必备知识点 1.数据类型2.引用变量赋值问题3. 对象和函数4.函数原型与原型链面试题一面试题二面试题一分析面试题二分析原型链注意点 5.执行上下文和执行上下文栈面试题一面试题二面试题一分析面试题二分析 6.作用域面试题一面试题二面试题一分析面试…

git(版本控制)详细解说【工作必备技能】

Git 1 什么是Git Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用…

轻松白嫖GPT-4,已经标星38K,不再害怕高昂的AI模型费用!

文章目录 白嫖GPT-4当前可白嫖站点 白嫖GPT-4 计算机专业学生xtekky在GitHub上发布了一个名为gpt4free的开源项目,该项目允许您免费使用GPT4和GPT3.5模型。这个项目目前已经获得了380000颗星。 开源地址:https://github.com/xtekky/gpt4free 简而言之&a…

软件开发:面向对象设计的七大原则!

七大原则 开闭原则、里氏代换原则、迪米特原则(最少知道原则)、单一职责原则、接口分隔原则、依赖倒置原则、组合/聚合复用原则。 开闭原则(The Open-Closed Principle ,OCP) 开闭原则:软件实体&#xff…

隐马尔科夫模型

隐马尔可夫模型 隐马尔可夫模型(Hidden Markov Model, HMM)可以由观测序列推断出概率最大的状态序列. HMM中的变量可分为两组: 状态变量(隐变量): { y 1 , y 2 , . . . , y n } \left \{ y_{1},y_{2},...,y_{n}\right \} {y1​,y2​,...,yn​};序列标注问题中的标注. 观察变量…

《Python程序设计与算法基础教程(第二版)》江红 余青松 课后选择题 课后填空题答案

目录 第一章一、选择题二、填空题 第二章一、选择题二、填空题 第三章一、选择题二、填空题 第四章一、选择题二、填空题 第五章一、选择题二、填空题 第八章一、选择题二、填空题 第一章 一、选择题 Python语言属于 C A.机器语言 B.汇编语言 C.高级语言 D.以上都不是 在下列…

【python】数据预处理:分位数归一化 Quantile Normalization + INSCODE AI创作助手测试

文章目录 写在前面标准化/归一化python模块qnorm实现分位数归一化R代码实现分位数归一化分位数归一化 - NSCODE AI创作助手的回答*Q1:Quantile Normalization是什么?**Q2-1: 什么时候用Quantile normalization?**Q2-2: 什么时候做Quantile no…

VScode软件下载与中文设置

目录 一、下载软件 二、中文设置 一、下载软件 1.网站上下载 2.百度网盘链接下载 链接:https://pan.baidu.com/s/1PMhxaExwhurDVVPkkbbYmw?pwd507o 提取码:507o 就选择路径->同意许可->完成下载 二、中文设置 1.在左侧扩展图标中打开“EXT…

Linux - 第20节 - 网络基础(网络层)

1.IP协议 • IP协议全称为“网际互连协议(Internet Protocol)”,IP协议是TCP/IP体系中的网络层协议。 • 在主机通信的过程中,上层应用程序解决从应用层代码中获取数据并处理数据的问题,应用层解决的是读取完整报文、序…

Lion:Adversarial Distillation of Closed-Source Large Language Model

Lion:Adversarial Distillation of Closed-Source Large Language Model IntroductionMethodologyexperiment Introduction 作者表明ChatGPT、GPT4在各行各业达到很好的效果,但是它们的模型与数据都是闭源的。现在的主流的方案是通过一个老师模型把知识蒸馏到学生模…

明明开发薪资高,是这几点让我依旧选了测试...

不管是对刚毕业的大学生、工作几年的打工仔亦或者是久不入职场的老人来说,进入职场的方向都值得我们深思。 今天我就来解答下大家最常问的问题:开发和测试作为一个项目中很重要的角色,他们有什么区别呢? Python自动化测试&#x…

Benewake(北醒) 快速实现TFmini-S-IIC与电脑通信的操作说明

目录 1. 概述2. 测试准备2.1 工具准备2.2通讯协议转换 3. IIC通讯测试3.1 引脚说明3.2 测试步骤3.2.1 TFmini-S-IIC 与 PC 建立连接3.2.2 获取测距值3.2.3 更改 slave 地址 1. 概述 通过本文档的概述,能够让初次使用测试者快速了解测试 IIC 通信协议需要的工具以及…

Svn安装

目录 一. 软件环境 二. SVN服务端 1. yum安装svn 2. 查看安装的文件列表 3. 建立版本库 3.1 修改数据存储默认位置 3.2 使用svnadmin建立版本库 4. 配制 4.1 添加用户 4.2 配制读写权限 4.3 配制服务 5. 启动服务 5.1 停止服务 5.2 启动服务 5.3 拉取项目 三.…

Vivado下组合逻辑模块的仿真

文章目录 与门或门非门异或门同或门比较器半加器全加器乘法器数据选择器3-8 译码器三态门 组合逻辑电路的特点是任意时刻的输出仅仅取决于输入信号,输入信号变化,输出立即变化,其变化不依赖于时钟。 本文中的例子中模块名都是gate&#xff0c…