大多数浏览器和
Developer App 均支持流媒体播放。
-
探索断点改进
断点让您可以在流程中途暂停和检查问题,有助于调试问题。探索 Xcode 中断点的最新改进,包括列和未解决的断点。我们还将介绍通用断点和 LLDB 提示和技巧的最佳实践。
资源
相关视频
WWDC22
WWDC19
WWDC18
-
下载
♪ (发现断点改进) 你好 我叫韩明永 是Xcode调试程序UI团队的 工程师 今天 我会谈到一些 团队在断点方面做出的改进 它可以让你的调试更有成效 我们先来讲一些关于断点的基础知识 便于大家理解 当你在程序中发现漏洞时 就意味着它并没有按照 你预期的结果执行 你会想用调试程序进行排查 为什么在执行时结果却出现了偏差 这个时候 你普遍会采取两种行动 一是 你会检查进程状态 来进一步了解情况 二是 你会通过单步调试进程 来检查代码逻辑 以上两种行动都需要你的调试位置 恰好处于漏洞触发之前 最好的办法是 通过设置断点将进程挂起 下面我们要提到三种 可以在Xcode中设置的常规断点 第一种是源文件断点 这些断点被设置在单个文件中 其中最常见的类型就是行断点 它是断点的主力军 并且在你需要中断检查整行的代码时 是非常有效的 最快速的创建方法 只需要点击想要设置断点那行代码 旁边的栅格 假设此时 我想通过单步调试 来检查函数 convertedToVolume的逻辑
但当我单步调试时 实际上调试的 是一个不同的表达式 编译器准确地判断出 函数adjustedDensity 的优先级最高 当然 我可以单步跳出 然后重新单步进入到函数中 但当你需要进行多次重复操作的时候 会很浪费时间 由此我们可以发现 有时行断点不够细化 这是因为编译器生成了 多个可供LLDB中断的位置 我们希望的结果是 convertedToVolume 被执行前停止 在Xcode 13 我们引入了列断点 它可以在你需要沿行处理并中断 某个特定表达式时 避免行断点在此方面的缺陷 要在convertedToVolume 设置一个列断点 可以在表达式处进行点击 以打开弹出框 然后选择 Set Column Breakpoint 就和行断点一样 你可以点击图标选择禁用还是启动 如果需要调整断点的话 可以双击图标 从而打开断点编辑器 既然我们不再需要行断点了 可以把它拖出栅格删掉 对于列断点也可以同样操作 我就不再演示了 按下Control键 或是鼠标右键点击 可以弹出记录了之前操作的菜单 这里我选择 Reveal in Breakpoint Navigator 子标题已经修改成 显示列断点的形式了 当我们点击继续调试 下一个NutritionFact 会被迭代执行 然后触发刚设置的列断点 当列断点被触发时 Xcode通过使用line PC 来告知你中断行的位置 它会用浅绿色突出显示那一行 在 Xcode 11.4 中 我们引入了column PC column PC会用绿色下划线 显示在表达式下方 来告知你中断列的位置 这样你就可以知道 调试程序下一步要执行的表达式了 由于我通过convertedToVolume 了解了column PC 我可以很有把握地单步进入这个函数 列断点在处理Swift闭包 和Objectice-C代码块时 特别有效 有时Swift的一行存在多个闭包 就像序号269这一行 在编译器处于调试状态下编译文件 它会生成一个叫 “line table"的映射 映射源行列来编译地址 所以对于该行中的每个闭包 编译器会生成一个行索引 调试程序会以此来进行中断 假设我想要检测 最后那个匿名参数 $0的闭包 我可以在269行设置一个行断点 但在中断之后 为了抓取最后的闭包 由于生成的行索引 我要进行多次单步进入和单步跳出 就像我们在Xcode 13看到的 可以简单地在最后的$0处 设置一个列断点 当暂停时 我们可以精准地停在该处 并且可以尽情地检查$0 居然看起来像是散发香气的榴莲奶昔 真是开启新一天的好方式 好吃! 接下来我们说说符号断点 它们是针对函数设置的断点 当这些函数执行时 它们会暂停进程 它们对以下情况非常有帮助 在源文件中断点不可使用 或使用不方便 举个例子 你无法访问源文件 因此 不能使用调试信息编译它们 或你执行一个常见函数的子类有很多 每个子类都要设置一个文件断点 这工作量非常庞大 我们来看看吧 我们点击 breakpoint navigator底部的 Add 按钮 它会打开一个我们可以 创建的断点列表 我们选择符号断点 断点编辑器就立即出现了 我们可以输入符号的名称 假设我们想要寻找在 在少数类中执行的 toggle函数中的中断 不需要一一寻找 在这里输入“toggle”即可
但你需要小心处理那些 名字是常用词的函数 因为LLDB会在进程加载的 所有库中匹配该名字 包括系统库 如果没有限制 就会出现许多已解决的断点位置 有时甚至可能上千 如果它们中的大部分 被执行路径频繁命中 会非常让人烦恼 幸好 我们可以将搜索限制 在一个特定的程序块 程序块是二进制文件或是 可以在执行中加载的图像 包括主二进制文件 我们输入”Fruta" 我们app的二进制名称 然后我们搜索到三个已解决的位置 这样就容易管理了许多 因为选择了奶昔 我们在Favorite按钮上引用 toggle函数 来命中刚刚设置的 符号断点 好了 对于符号断点来说 排版错误很容易发生 然后在进程执行期间 断点没有被命中 你就只能茫然地挠头了 我们来试试创建 “convertedToMass"吧
这是Xcode 13的新内容 如果一个断点没被LLDB 解析到任何位置 Xcode会显示一个虚线图标 断点没被解决的原因有无数个 但它们都有共同的解释 当你把鼠标悬停在 未解决的断点图标上 会出现提示文字帮助你 首先要说的几个原因 涉及到断点的种类 所以对于一个符号断点来说 名称必须要拼写正确 并且符号必须要存在于它的库中 接下来的原因更为普遍: 存储断点的库须已加载 有时 库只有在你完成了 某些用户操作后才能加载完成 比如点击了按钮 而且在那种情况下 LLDB会自动为你解析断点 既然如此 我猜是拼写出了问题 我们一起把错误找出来吧 一种方法是使用 Find navigator函数 搜索”convert" 如你所见 这里有很多搜索结果 用肉眼分析它们要花些时间 相反 我们可以利用LLDB 来使用一个与之不同的小窍门 在Xcode Console 我们输入“image” 它也代表着程序块 “lookup-r" 代表正则表达式 ”n"代表名称 “covert”
然后我们输入程序块的名称 Fruta. 来限制搜索 可以看到结果只有四个匹配项 并且确认函数名称的拼写有误 正确的应该是 “convertedToMass" 我们来把它复制粘贴到断点编辑器中
这次 LLDB成功地解析了 并给出了第一个位置
如果你对其它的 LLDB使用技巧感兴趣 可以观看我们的往期视频 ”LLDB: 超越 ’po." 让我们来打开一个不同的文件
未解决的断点还可以在 源文件断点中看到 与之相关的有两个原因 第一 有断点的一行一定会被编辑 在这种情况下 行23 没有被编辑 因为它是编译程序条件的其它部分 并且 编译程序一定会生成 程序块的调试信息 如果没有生成 你就要检查 你的构建设置 另一个是运行时间问题断点 运行时间问题就是运行时产生的问题 比如 在后台线程中 改变了UI状态 它不如程序崩溃那么严重 并且因为预设值 Xcode 不会中断你的进程 因为它能在你关注不同的漏洞时 形成很大的干扰 因此 当运行时间问题出现时 Xcode记录下回溯 并且在 问题navigator中显示 但因为问题是过去出现的 就没必要在当前进程状态中检测了 因此有时候 你想在它出现的时候捕捉它 运用运行时间问题断点 让你可以在调试程序中进行中断 并且可以立即查看进程 运行时间问题断点有几种不同类型 你可以通过类型弹出窗 很容易选择出具体类型 请记住 对于它们之中的一些类型 你需要启用在Scheme编辑器的 Diagnostics标签里 禁用的对应特征 你只需要点击Go To按钮 就可以跳转到相关页面 因为我们想要使用 主线程检测器运行时间问题断点 所以需要启用主线程检测器 希望这个视频向你展示出了 我们在Xcode 13中 关于断点方面进行的改进 断点可以最大程度地提升 程序的调试能力 它绝对应该成为你的保留项目 感谢收看 请继续观看 其它的WWDC视频 ♪
-
-
0:01 - Using LLDB to find a symbol in the process
image lookup -rn convert Fruta
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。