首页 > 解决方案 > 带有调试器的断点 Commend 在 xcode 中跳转

问题描述

我在 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”或单击变量视图中的打印描述时,它会显示失败消息,这是怎么回事?

标签: swiftxcodelldb

解决方案


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

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

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

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

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

顺便说一句,您的图片链接似乎没有解决。


推荐阅读