关闭 CLANG_ENABLE_MODULE_DEBUGGING 后果

turning off CLANG_ENABLE_MODULE_DEBUGGING consequences

为了解决 xcode 7.3 中的 apple 错误,其中 xcode 在遇到某些断点时会爆炸,我们需要关闭 CLANG_ENABLE_MODULE_DEBUGGING 或继续使用 xcode 7.2。关闭 CLANG_ENABLE_MODULE_DEBUGGING 听起来不错。

无法在典型的 iOS 开发人员工作环境中调试 CLang 模块究竟意味着什么?如何知道哪些 CLang 模块被直接或间接依赖?

这里有一个关于爆炸问题的讨论:https://forums.developer.apple.com/message/126468#126468

了解 CLang 模块并调试它们

这是一个Introduction to Objective-C Modules

来自另一个标题为 Apple Releases Xcode 7 Beta 的来源:

Clang modules and precompiled headers for C, C++, Objective-C, and Objective-C++ contain debug information for the types they define. When building with the Xcode setting CLANG_ENABLE_MODULE_DEBUGGING=YES (enabled by default), clang stores references to the types

我看到我们的一些 Cocoa Pods 使用 @import,这似乎是相关的。

关闭此功能后我们看不到的调试信息的典型示例是什么?

当打开 clang 模块调试时,clang 会为您的代码导入的任何模块中包含的所有类型生成调试信息,每个模块都在各自独立的调试信息部分中,然后所有其他调试信息都可以使用通过指向调试信息中该模块的部分来获取来自该模块的类型。

当关闭 clang 模块调试时,每个编译单元(.c、.m 或 .swift 文件)将获得它使用的任何类型的副本,并在本地引用它们。

所以转动这个"on"可以减少大型项目的调试信息的大小。

此外,由于调试信息可能会变得相当大,在 "off" 的情况下,编译器会使用一些技巧来保持调试大小可控。例如,clang 仅将使用过的类型发送到调试信息中,因此如果程序中没有人使用某个模块中的某个类型,您将不会获得该类型的调试信息。这通常不是一个大问题,因为如果您从不在代码中使用某种类型,您就不太可能在调试中使用它。但它有时会引起问题。

它也不会为您的程序使用但未定义的函数发出签名信息。这就是为什么您最终不得不在 "print" 命令中的表达式中强制转换 return 类型,而您不必在代码中强制转换。

OTOH,当它是 "on" 时,因为编译器知道它只需要生成一次此信息,所以它可以更完整地说明它发出的内容。

对于 Objective C,您可以解决任何缺失的 types/function 签名,这些签名来自您正在使用的模块 运行:

(lldb) expr @import "FrameworkWhoseTypesOrSignaturesYouWant"

在调试会话开始时。