WWDC 2018 —使用Xcode和LLDB进行高级调试— 412

简介:我们应该避免在进行每个修复后重新运行代码,并继续进行调试。

今天我们将讨论以下几点:

  • 更改/注入代码
  • 打印汇编代码值
  • 通过lldb命令添加符号断点
  • 跳过代码行
  • 自定义调试说明
  • 观察点
  • 在目标C模式下运行命令
  • 创建命令别名
  • 在LLDB中使用python脚本
  • 从调试器更新动画
  • 约束调试

更改/注入代码

要在断点处编辑值,请使用以下lldb命令

 表达式variable_name =值 

您还可以配置断点以自动完成此操作。 单击断点>编辑断点

注入代码:假设您忘记设置委托,现在不用重新运行,而使用相同的表达式来注入并继续调试。

打印汇编代码值

假设您已经为UIlabel setText方法设置了符号断点

现在,当遇到断点时,如何在汇编代码中看到调试点时如何打印值

在这一点上尝试这些命令并观察值

  po $ arg1 
po(SEL)$ arg2
po $ arg3

通过lldb命令添加符号断点

假设我们要在另一个断点被击中后激活一个符号断点。 然后,我们可以使用以下调试器命令创建一个断点。

 断点集-一键式true --name“-[UILabel setText:]” 

跳过代码行

为要跳过的行设置一个断点,然后只需将包含两行的按钮拖动到下一行即可。

我们想在每次点击时跳过此行,让我们为其配置断点

 跳线-1 

自定义调试说明

对于自定义类,我们可以实现此协议以在LLDB中获取描述

观察点

监视点就像一个断点,每次更改属性时都会暂停。 可以使用调试器的变量部分中的上下文菜单进行设置。

在目标C模式下运行命令

有一些客观的C库,您想以ObjC方式发送命令或发送命令,而无需进行swift的严格类型检查。 为此,您可以使用下面的expression命令

 表达式-l objc -o-[`self.view` recursiveDescription] 

反刻度是可选的,就像预处理程序步骤一样,先评估然后插入结果。

创建命令别名

想象一下,如果您不得不一次又一次地输入此代码,则表达式-l objc -o —

 命令别名poc表达式-l objc -o- 

在LLDB中使用python脚本

导入python文件: 命令脚本import〜/ nudge.py

从此处下载nudge.py。使用脚本将自定义命令添加到LLDB

从LLDB更新动画

使用unsafeBitCast更改内存地址或表达式命令的所需值,然后使用CATransaction.flush()在调试时执行动画

约束调试

打开Xcode的Visual Debugging模式>选择约束>从视图调试器复制约束。

现在,当您使用po粘贴LLDB时,您将获得它的地址,然后可以继续使用expression命令和CATransaction.flush()对其进行更新。

在视觉检查器中为堆栈跟踪启用“ Malloc堆栈”。

如果您已经实现了“自定义调试描述”,那么您还将在此检查器中看到它。

xcode的调试栏为目标应用程序提供了新的亮和暗模式选项。


下一页:自动化App Store Connect — 303

转到目录

Previous:拥抱算法— 223