swift - 带有调试器的断点 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
我的问题是:
- 我应该如何输入 lldb 来选择位置?
- 有没有更好的方法来强制传入 If 语句而不更改代码并重建项目?
- 有时当我在 lldb 中键入“po”或单击变量视图中的打印描述时,它会显示失败消息,这是怎么回事?
解决方案
1)在lldb中,等效的命令是thread jump
,您可以在那里指定地址和行号。
2)thread jump
或 Xcode 等价物本质上是危险的操作。如果您跳过某些变量的初始化,您现在将处理不良数据并且可能会崩溃。这种事情你有时可以通过眼睛发现——尽管 Swift 对初始化很懒惰,所以变量的实际初始化可能不会发生在你认为它在源代码中进行的地方。还有更微妙的问题。例如,如果您跳过一些作为其操作的副产品保留或释放对象的代码,则该对象将最终保留不足或过度保留。前者会导致崩溃,后者会导致内存泄漏。这些保留和释放是由编译器生成的,因此您无法在源代码中看到它们,但如果您查看正在跳过的代码的反汇编,您可以看到它们。
如果不查看有问题的代码,我不知道为什么这个特定的跳转会导致崩溃。
但是您不能 100% 安全地跳过编译器选择发出的某些代码。查看反汇编,您可能会发现(a)在跳转之前停止的更好位置 - 即停止一些导致问题的保留或释放或跳转到行中间的地址,因此您仍然调用需要的保留。你必须手动解决这个问题。
3)没有足够的信息来回答这个问题。
顺便说一句,您的图片链接似乎没有解决。
推荐阅读
- specflow - SpecflowPlusRunner 使用旧版本的 Newtonsoft,Json 的奇怪行为 - 你如何更新它?
- timestamp - 如何将“Jan 15 2019 6:57PM”解析并转换为雪花中的时间戳格式
- tailwind-css - 如何为带有渐变的背景创建一个tailwindcss插件?
- php - 在 WooCommerce 中基于“标签 ID”在单个产品页面上添加特定信息
- ios - 在 Xcode 12 选项卡中更改文件名剪切(3 个点)
- javascript - 如何让收集器检查聊天中没有写下来的用户?
- javascript - 关于 li HTML 标签问题的 PrimeNG 工具提示
- amazon-web-services - 如何将 bitnami CouchDB 与 Cloudwatch 或 Cloudtrail AWS 连接以获取审计级别日志记录?
- python - 正则表达式在 = 之后分隔数字
- docker - 从外部运行的现有 HazelCast 集群启动 Vert.x 集群管理器