【问题标题】:breakpoint with debugger Commend jump in xcode带有调试器的断点 Commend 在 xcode 中跳转
【发布时间】:2019-01-15 05:16:11
【问题描述】:

我在 Xcode 中使用跳转命令设置了一个断点以强制传递某些条件,但是当它执行到第 168 行时,它会崩溃并显示消息

"Thread 1: EXC_BAD_ACCESS (code=1, address=0x1)"

为什么会这样?

控制台记录:

警告:MoreMultitypeCollectionViewCell.swift:178 在此函数中出现多次,选择第一个位置:

MoreMultitypeCollectionViewCell.(updateButtonStateCkeck in _9A12557DCAB30EEB52DC7C2EA09487CD)() -> () + 1580 at MoreMultitypeCollectionViewCell.swift:178

MoreMultitypeCollectionViewCell.(updateButtonStateCkeck in _9A12557DCAB30EEB52DC7C2EA09487CD)() -> () + 1600 at MoreMultitypeCollectionViewCell.swift:178

我的问题是:

  1. 我应该如何输入 lldb 来选择位置?
  2. 有没有更好的方法来强制传入 If 语句而不更改代码并重建项目?
  3. 有时我在lldb中输入'po'或者在变量视图中点击打印描述,它会显示失败信息,这是怎么回事?

【问题讨论】:

    标签: swift xcode lldb


    【解决方案1】:

    1) 在 lldb 中,等效的命令是thread jump,您可以在那里指定地址和行号。

    2) thread jump 或 Xcode 等效操作本质上是危险的操作。如果您跳过某些变量的初始化,您现在将处理不良数据并且可能会崩溃。这类事情你有时可以通过眼睛发现——尽管 Swift 对初始化很懒惰,所以变量的实际初始化可能不会发生在你认为它在源代码中所做的地方。还有更微妙的问题。例如,如果您跳过一些作为其操作的副产品保留或释放对象的代码,则该对象最终将被保留不足或过度保留。前者会导致崩溃,后者会导致内存泄漏。这些保留和释放是由编译器生成的,因此您无法在源代码中看到它们,但如果您查看要跳过的代码的反汇编,则可以。

    如果不查看有问题的代码,我不知道为什么这个特定的跳转会导致崩溃。

    但是您不能 100% 安全地跳过编译器选择发出的某些代码。查看反汇编,您可能会发现(a)在跳转之前停止的更好位置 - 即停止一些导致问题的保留或释放或跳转到行中间的地址,因此您仍然调用需要的保留。你必须手动解决这个问题。

    3) 没有足够的信息来回答这个问题。

    顺便说一句,您的图片链接似乎无法解析。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-27
      • 2011-03-16
      • 2013-06-08
      • 1970-01-01
      • 2021-04-20
      • 2012-07-17
      • 2017-04-02
      相关资源
      最近更新 更多