ios - 关闭 CLANG_ENABLE_MODULE_DEBUGGING 结果

标签 ios xcode debugging clang llvm-clang

为了解决 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 文件)将获得它使用的任何类型的副本,并在本地引用它们。

因此将此“打开”可以减少大型项目的调试信息的大小。

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

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

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

对于 Objective C,您可以通过运行来解决来自您正在使用的模块的任何缺失的类型/函数签名:

(lldb) expr @import "FrameworkWhoseTypesOrSignaturesYouWant"

在调试 session 开始时。

关于ios - 关闭 CLANG_ENABLE_MODULE_DEBUGGING 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36265490/

相关文章:

ios - Swift 中的自定义 MKAnnotation 未添加到 map 的注释中

objective-c - 仅在纵向模式下伪造横向 View

iphone - 如何将 XML 作为字符串发送到 Soap Action?

在 Visual Studio 代码中调试 gulp 运行的 jasmine 测试用例?

ios - 如何防止 UITextView 文本在打字时移动到顶部?

ios - clang:错误:没有这样的文件或目录: '/Users/waterskiingmithrill/Development/iPhone/Event/Event_Prefix.pch'

iphone - 这是将 objective-c 数组设置为彼此相等的最佳方法吗?

ios - 没有 '|' 候选产生预期的上下文结果类型 'CGGradientDrawingOptions'

debugging - 如何调试 Prolog 程序

debugging - OllyDbg 2.01 - 查找引用静态字符串的命令