使用调试器 Commend 在 xcode 中跳转的断点

breakpoint with debugger Commend jump in xcode

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

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

为什么会这样?

控制台记录:

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

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

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

我的问题是:

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

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

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

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

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

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

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