关闭CLANG_ENABLE_MODULE_DEBUGGING后果

时间:2016-03-28 15:30:14

标签: ios xcode debugging clang llvm-clang

为了解决xcode 7.3中的一个苹果bug,当遇到一些断点时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的来源:

  

用于C,C ++,Objective-C和C语言的Clang模块和预编译头文件   Objective-C ++包含它们定义的类型的调试信息。   使用Xcode设置CLANG_ENABLE_MODULE_DEBUGGING = YES进行构建时   (默认情况下启用),clang存储对类型的引用

我看到我们的几个Cocoa Pod使用@import似乎相关。

我们在此处看不到的调试信息的典型示例是什么?

1 个答案:

答案 0 :(得分:6)

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

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

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

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

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

OTOH,当它“打开”时,由于编译器知道它只需要生成一次这个信息,它可以更完整地发布它。

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

(lldb) expr @import "FrameworkWhoseTypesOrSignaturesYouWant"

在调试会话开始时。