【问题标题】:iOS Simulator swift app hitting breakpoint in swift_dynamicCastObjCClassUnconditionaliOS 模拟器 swift 应用程序在 swift_dynamicCastObjCClassUnconditional 中命中断点
【发布时间】:2015-03-16 04:08:19
【问题描述】:

每次我在 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(code=EXC_i386_BPT, subcode=0x0) error with no description 在它给我完全相同的问题之前,但它告诉我“可本地化的字符串无法加载' 指的是故事板。虽然现在它只告诉我 (lldb) 什么。我想知道这是否也与故事板有关。请帮忙

【问题讨论】:

  • (lldb) 是一个提示,而不是任何类型的输出。
  • 添加异常断点并运行。
  • @Shruti 我这样做了,但它仍然崩溃。应该发生什么?

标签: ios xcode storyboard ios-simulator lldb


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我不明白。我应该怎么做才能解决这个问题?每次我构建应用程序时都会发生这种情况
    • 在 lldb 提示符下,c ,或者通过 XCode GUI 继续执行。
    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多