调试器的断点推荐在xcode中跳转

时间:2018-08-08 03:27:51

标签: swift xcode lldb

我在Xcode中创建了一个断点,并通过跳转来强制传递一些条件,但是当它执行到第168行时,它崩溃并显示消息

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

enter image description here

enter image description here

为什么会这样?

控制台登录:

警告: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'或在变量视图中单击打印说明时,它会显示失败消息,那是怎么回事?

1 个答案:

答案 0 :(得分:2)

1)在lldb中,等效命令为thread jump,您可以在其中指定地址和行号。

2)thread jump或等效的Xcode是一种固有的危险操作。如果跳过某些变量的初始化,那么您现在将处理错误的数据,并且很可能会崩溃。有时您可能会发现这种事情-尽管Swift对初始化不满意,所以实际的变量初始化可能不会在您认为它在源代码中发生的地方发生。还有更多的细微问题。例如,如果跳过一些代码,该代码作为其操作的副产品保留或释放了一个对象,则该对象最终将处于保留状态之下或之上。前者将导致崩溃,后者将导致内存泄漏。这些保留和释放是由编译器生成的,因此即使您查看要跳过的代码的反汇编,也可以在源代码中看不到它们。

如果不查看相关代码,就无法知道为什么这种特殊的跳转会导致崩溃。

但是您不能100%安全地跳过编译器选择发出的某些代码。查看反汇编,您可能可以发现(a)在跳转之前停下来的一个好地方-即停止经过引起问题的某些保留或释放,或跳到行中间的地址,以便您仍然致电需要保留。您必须手动解决这个问题。

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

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