【问题标题】:Swift 1.2 segmentation fault on compile of Release scheme编译发布方案时出现 Swift 1.2 分段错误
【发布时间】:2015-04-10 20:31:00
【问题描述】:

我刚刚升级到 Swift 1.2,当我尝试使用 Release 方案编译 iOS 应用程序时,我收到“分段错误:11”。

0  swift                    0x00000001105a9a08 llvm::sys::PrintStackTrace(__sFILE*) + 40
1  swift                    0x00000001105a9ee4 SignalHandler(int) + 452
2  libsystem_platform.dylib 0x00007fff9a724f1a _sigtramp + 26
3  libsystem_platform.dylib 0x00007fff4fd6f6b0 _sigtramp + 3043272624
4  swift                    0x00000001100e837a (anonymous namespace)::DCE::markControllingTerminatorsLive(swift::SILBasicBlock*) + 346
5  swift                    0x00000001100e8109 (anonymous namespace)::DCE::markValueLive(swift::ValueBase*) + 201
6  swift                    0x00000001100e791f (anonymous namespace)::DCE::run() + 1983
7  swift                    0x000000011008f55e swift::SILPassManager::runFunctionPasses(llvm::ArrayRef<swift::SILFunctionTransform*>) + 1310
8  swift                    0x000000011008ffe9 swift::SILPassManager::runOneIteration() + 633
9  swift                    0x000000011008ea56 swift::runSILOptimizationPasses(swift::SILModule&) + 790
10 swift                    0x000000010fe92ee7 frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 4695
11 swift                    0x000000010fe91ae6 main + 1814
12 libdyld.dylib            0x00007fff995665c9 start + 1

当我使用 Dev/Debug 方案时,应用程序可以完美编译和运行。

我已将编译器问题缩小到一个文件和几行代码。

let directPhoneType = PhoneNumber.Codes.Contacts["D"]
phoneTypes = phoneTypes.filter { $0 != directPhoneType }

我尝试过更改过滤代码(使用“元素输入”等),但每次尝试仍然会导致分段错误。在我们的整个应用程序中还有其他过滤逻辑可以很好地编译。

如果我删除过滤代码或将其更改为手动过滤电话类型的循环,则应用程序在发布方案中运行良好。

我尝试将优化级别设置为“最快,未选中”或“最快”,仍然出现分段错误。如果我将优化级别设置为“无”;项目构建。

此代码在 Swift 1.2 之前在两种方案中都运行良好。

有人知道这里发生了什么吗?

更新: 看起来 Xcode 6.3.1 已经修复了我的 seg 错误问题。

【问题讨论】:

  • 您已将一个测试版替换为另一个测试版
  • 我发现了这个,这对我有用。我不确定不启用检查会产生什么后果stackoverflow.com/questions/26508911/…
  • 将优化级别设置为最快,未选中并不能解决我的问题。如果我将优化级别设置为无;项目构建。
  • 1.编译器不应该崩溃。由于您显然有一个减少的测试用例,请file a bug 这样苹果可以解决这个问题。 2. 作为一种解决方法,尝试在directPhoneType$0 上显式声明类型,也许?
  • 是的,我尝试了显式输入,但没有运气。我已经提交了一个错误,现在将使用“无”优化。谢谢。

标签: ios swift


【解决方案1】:

遇到了同样的问题,但没有与您类似的代码。关闭整个模块优化(默认关闭)为我解决了这个问题,这意味着我仍然可以使用最快优化设置进行存档。

【讨论】:

  • 我打开了整个模块优化(已关闭),它对我有用。
【解决方案2】:

不幸的是,我们一直都有这些问题。问题不在于你,他们很难追查到。通常有些随意的代码更改最终会解决问题。

我们开发的各种迷信包括:尽可能减少unowned 的使用,尽可能减少weak 的使用,注意?? 运算符,注意一行中“太多”的东西(例如max(min(x,y),z)),将let切换为var

在您的代码中,我可能会尝试将您的 let 切换为 var,或者尝试删除过滤器并做一个老派

var resultList = [MyType]()
for type in phoneTypes {
     if type != directPhoneType {
         resultList.append(type)
     }
}

或更改 PhoneNumber.Codes.Contacts["D"] 以不同方式访问。

祝你好运!狩猎愉快。

【讨论】:

  • 我同意 - 由于@wxs 所述的任何原因,都可能发生此错误。虽然根据我的经验,这是 Swift 编译器实际检测到编译时错误,但由于某种原因,它无法产生更好的错误消息。请允许我补充:检查您的任何隐式展开的选项是否为零,尤其是在您链接它们的区域。
【解决方案3】:

我在切换到 Swift 1.2 时遇到了这个问题,而不仅仅是发布方案。迁移时,我更改了推荐的“as!” “作为?”认为这是我想要的。这似乎导致了问题;我回去改成“as!”并且成功了。

【讨论】:

    猜你喜欢
    • 2014-08-05
    • 2014-11-21
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2020-02-15
    • 2020-07-04
    • 2021-10-23
    • 1970-01-01
    相关资源
    最近更新 更多