iOS 模拟器 swift 应用在 swift_dynamicCastObjCClassUnconditional 中遇到断点

iOS Simulator swift app hitting breakpoint in swift_dynamicCastObjCClassUnconditional

每次我在 iOS 模拟器中 运行 我的 switf 应用程序时,它会立即崩溃:

libswiftCore.dylib`swift_dynamicCastObjCClassUnconditional:
0x1082c1620:  pushq  %rbp
0x1082c1621:  movq   %rsp, %rbp
0x1082c1624:  pushq  %rbx
0x1082c1625:  pushq  %rax
0x1082c1626:  movq   %rsi, %rcx
0x1082c1629:  movq   %rdi, %rbx
0x1082c162c:  xorl   %eax, %eax
0x1082c162e:  testq  %rbx, %rbx
0x1082c1631:  je     0x1082c164c               ;     swift_dynamicCastObjCClassUnconditional + 44
0x1082c1633:  movq   0x82756(%rip), %rsi       ; "isKindOfClass:"
0x1082c163a:  movq   %rbx, %rdi
0x1082c163d:  movq   %rcx, %rdx
0x1082c1640:  callq  0x1082c41ca               ; symbol stub for:   objc_msgSend
0x1082c1645:  testb  %al, %al
0x1082c1647:  movq   %rbx, %rax
0x1082c164a:  je     0x1082c1653               ;           swift_dynamicCastObjCClassUnconditional + 51
0x1082c164c:  addq   [=13=]x8, %rsp
0x1082c1650:  popq   %rbx
0x1082c1651:  popq   %rbp
0x1082c1652:  retq   
0x1082c1653:  leaq   0xcdc8(%rip), %rax        ; "Swift dynamic cast failed"
0x1082c165a:  movq   %rax, 0x8ae57(%rip)       ; gCRAnnotations + 8
0x1082c1661:  int3   
0x1082c1662:  nopw   %cs:(%rax,%rax)

突出显示最后一行告诉我 EXC_BREAKPOINT(code=EXC_i386_BPT, subcode=0x0) 没有描述的错误 在它给我完全相同之前问题,但它告诉我 'localizable string has failed to load' 指的是故事板。虽然现在它什么也没告诉我 (lldb)。我想知道这是否也与情节提要有关。请帮助

您的应用程序的执行已停止,因为它遇到了断点,可能是因为您正在中断所有异常。这不是崩溃,很可能是正常行为。继续执行即可。

异常也可能表示您的应用程序中存在真正的错误。继续操作可能会为您提供比 swift 代码中的动态转换失败更具体的信息。

如果没有,我建议您查看 swift 代码并审核您的动态转换。

这里的关键事实是您在停止之前执行的最后一条指令是 "int3"。 int3 指令既被调试器使用——它是调试器插入到你的代码中以实现断点的指令——它也被一些系统库使用,包括 Swift 标准库,在以下情况下实现 "assert into the debugger"发生了一些致命错误。区分这两种用法的方法是,如果 "int3" 是由调试器插入的,它不会在反汇编中向您显示 int3 指令,它会向您显示它正在替换的原始指令。此外,如果它是我们的一个,lldb 不会报告 EXC_BREAKPOINT 作为停止原因,它会告诉你你遇到了哪个断点。所以这必须是一个库断言。

没有更多上下文,我无法确定发生了什么,但它看起来像 swift 标准库断言,因为有人试图转换一些 swift 支持的对象ObjC 对象为某种无法转换为的类型。

我会查看崩溃点上方的堆栈,看看您是否能看到此类内容。你说你的故事板一直有问题。如果调用此断言的代码看起来与内部化故事板有关,那么您的项目中的代码可能有问题,IB 中的反序列化器读取了一些垃圾而不是所需的对象,并且第一点失败是数据无法转换为合理的东西。这不是我非常了解的领域,但是,当你崩溃时查看堆栈列表并试图找出程序正在做什么会导致转换错误在我看来是你调查中最有希望的下一步.