调试预建框架

这是我如何解决一个奇怪需求的简短简历,并发现了lldb高级命令的隐藏功能。

在谈论iOS / Mac开发中的框架时,通常会考虑在静态或动态库中构建的一组源代码文件,最终会嵌入一些其他资源。 有很多众所周知的工具(例如CocoaPods和Carthage)可以为您完成这些任务,因此这里没有什么新鲜事物。

最近,我们面临着一种可能被视为相反的方式:在我们的项目中有一个框架,我们有在另一个位置(项目之外)生成该框架的源文件,我们希望能够使用调试器逐步进入框架类。

那到底是为什么呢?

为了优化项目的构建时间,我们有一个特殊的流程,在该流程中,我们可以构建框架并将其提交到我们的仓库中,而不是源文件中。 尽管这有一些缺点可能值得在另一篇文章中讨论,但我们对结果感到非常满意,因为我们将构建时间减少了三分之一以上,从大约7分钟减少到大约2分钟。 此外,将我们的应用程序划分为多个框架迫使我们重新思考整个架构,从而清楚地将我们的依赖项隔离开来,这是一个不错的奖励!

我们构建的框架附带了DWARF调试信息,这些信息可以使用dwarfdump进行解析并转换为人类可读的内容。 该工具的使用真的非常有趣,并且可以提取的内容令人赞叹。 DWARF调试信息按节进行构造,每个编译单元一个节,并且通过调用dwarfdump --debug-info您将获得存储在.debug_info节中的所有信息。 其中包括符号之间的匹配以及源代码文件中的精确位置,如下面的屏幕快照所示。

请注意,源文件的路径是绝对路径,这意味着该文件甚至可能不存在(请考虑在另一台计算机上构建框架的情况)。

对我们来说幸运的是,我们正在不同的机器上构建框架,但是总是从同一路径/ tmp / SubitoFrameworksBuilder构建框架,由于这个假设,这只是重新映射路径的问题。 能做到吗? 是的,事实证明,使用lldb的以下命令确实很容易:

settings set target.source-map '' ''

每次启动调试器时都要编写代码,这很繁琐,但是好消息是,每次启动应用程序时,都有一种方法可以通过将上述行添加到~/.lldbinit-Xcode来自动执行。 能够按项目而不是按用户执行此操作会很好,但是不幸的是,有一个开放的雷达坐在那里一段时间。

~/.lldbinit-Xcode每一行都~/.lldbinit-Xcode执行,从而允许您定义别名和自定义命令。 值得检查一下Facebook已发布的功能非常强大的功能。

回顾一下:通过一个lldb命令,我们现在可以将调试器与我们的预构建框架一起使用,在文件系统中的某个位置具有源代码文件。

😎