Swift/Objective-C 崩溃:调试时交换了 class 个初始值设定项
Swift/Objective-C Crash: Swapped class initializers while debugging
总结
我在工作中的 Xcode 项目中遇到了一个严重的问题,对于如何进一步缩小或解决此问题的任何建议、提示或评论,我将不胜感激!
自一两周以来,我们的项目在 Swift classes 初始化或使用它们的类型的随机位置调试时(在模拟器和设备上)崩溃。
例子
这是它的外观示例:
- table 视图无法识别 ListSectionHeader 的继承
- 打印类型时,返回不同的 class
.self
返回的class总是我们Core.framework 的Objective-Cclass
另一个示例,其中 super.init
调用失败,因为调试器突然将父 class 混淆为不同类型:
- 有时会直接崩溃,当Swiftclass初始化为
BAD_EXEC_ACCESS
我们的尝试
到目前为止我们注意到并尝试过的事情:
- 崩溃在发布版本中消失
- 启用内存或线程清理器后问题消失
- 问题发生在 Xcode 12.4、12.5.1 和 Xcode 13.0
- 我们启用了“SWIFT_COMPILATION_MODE = wholemodule”,这使问题消失了一段时间,但在将更多 Swift 代码添加到项目后它又回来了
- 如果我们添加或删除 Swift 代码,崩溃将移动到不同的 class,就好像 class 名称的映射 table (??) 和类型已移动(此处纯属猜测)
- 到目前为止,我无法在示例项目中重现该问题
附加信息
关于我们项目的一些事情:
- Xcode 带有一些静态框架的工作区
- 核心框架,其中大部分是 Objective-C classes
- 一个仅 Swift 的用户界面框架,并在许多 classes
中导入核心模块
- 我们所有的框架都是伞形框架的一部分,该框架集成在我们用于调试的测试应用程序中
结尾的想法
我怀疑我们可能会意外触发某种编译器优化错误,这与我们混合的 Swift 和 Objective-C 代码库有关。
如果有人知道如何缩小崩溃的范围,或者看到了这些症状,我将不胜感激。现在它阻止我们进行任何开发。
我们无法确定问题的根本原因,但是当我们在应用方案中禁用测试计划时,我们设法避免了 crash/bug。当我们创建一个新的应用程序目标并且一切正常时,我们注意到了这一点。重新配置目标和方案后,添加 UI-测试计划后问题再次出现。
也许这个策略可以帮助遇到类似问题的任何人。
总结
我在工作中的 Xcode 项目中遇到了一个严重的问题,对于如何进一步缩小或解决此问题的任何建议、提示或评论,我将不胜感激!
自一两周以来,我们的项目在 Swift classes 初始化或使用它们的类型的随机位置调试时(在模拟器和设备上)崩溃。
例子
这是它的外观示例:
- table 视图无法识别 ListSectionHeader 的继承
- 打印类型时,返回不同的 class
.self
返回的class总是我们Core.framework 的Objective-Cclass
另一个示例,其中 super.init
调用失败,因为调试器突然将父 class 混淆为不同类型:
- 有时会直接崩溃,当Swiftclass初始化为
BAD_EXEC_ACCESS
我们的尝试
到目前为止我们注意到并尝试过的事情:
- 崩溃在发布版本中消失
- 启用内存或线程清理器后问题消失
- 问题发生在 Xcode 12.4、12.5.1 和 Xcode 13.0
- 我们启用了“SWIFT_COMPILATION_MODE = wholemodule”,这使问题消失了一段时间,但在将更多 Swift 代码添加到项目后它又回来了
- 如果我们添加或删除 Swift 代码,崩溃将移动到不同的 class,就好像 class 名称的映射 table (??) 和类型已移动(此处纯属猜测)
- 到目前为止,我无法在示例项目中重现该问题
附加信息
关于我们项目的一些事情:
- Xcode 带有一些静态框架的工作区
- 核心框架,其中大部分是 Objective-C classes
- 一个仅 Swift 的用户界面框架,并在许多 classes 中导入核心模块
- 我们所有的框架都是伞形框架的一部分,该框架集成在我们用于调试的测试应用程序中
结尾的想法
我怀疑我们可能会意外触发某种编译器优化错误,这与我们混合的 Swift 和 Objective-C 代码库有关。
如果有人知道如何缩小崩溃的范围,或者看到了这些症状,我将不胜感激。现在它阻止我们进行任何开发。
我们无法确定问题的根本原因,但是当我们在应用方案中禁用测试计划时,我们设法避免了 crash/bug。当我们创建一个新的应用程序目标并且一切正常时,我们注意到了这一点。重新配置目标和方案后,添加 UI-测试计划后问题再次出现。
也许这个策略可以帮助遇到类似问题的任何人。