iOS模拟器swift应用程序在swift_dynamicCastObjCClassUnconditional中命中断点

时间:2015-03-16 04:08:20

标签: ios xcode storyboard ios-simulator lldb

每次我在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   $0x8, %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(代码= EXC_i386_BPT,子代码= 0x0)错误,没有说明,然后它给了我完全相同的问题,但它告诉我'可本地化的字符串无法加载'指的是故事板。虽然现在它只告诉我任何东西(lldb)。我想知道这是否与故事板有关。请帮忙

2 个答案:

答案 0 :(得分:1)

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

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

如果没有,我建议您查看快速代码并审核您的动态投射。

答案 1 :(得分:1)

这里关键的事实是你在停止之前执行的最后一条指令是“int3”。调试器使用int3指令 - 它是调试器插入代码以实现断点的东西 - 并且它被一些系统库(包括Swift标准库)用于在发生某些致命错误时实现“断言到调试器”已经发生了。你可以区分这两种用法的方法是,如果调试器插入了“int3”,它就不会在反汇编中显示int3指令,它会显示它正在替换的原始指令。如果它是我们的一个,lldb不会报告EXC_BREAKPOINT作为停止原因,它会告诉你你遇到了哪个断点。所以这必须是一个库断言。

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

我会在崩溃点之上查看堆栈,看看你是否可以看到这种类型的东西。你说你的故事板出了问题。如果调用此断言的代码看起来与内化故事板有关,那么可能是项目中的那些有问题,IB中的反序列化器读取了一些垃圾而不是所需的对象,并且第一点是失败的原因是数据不能转化为合理的东西。这不是我所知道的那个领域,但是,当你崩溃时查看堆栈列表并试图弄清楚程序正在做什么会导致出现错误,这似乎是我调查中最有希望的下一步