'项目名称'是通过优化编译的 - 步进可能表现得很奇怪;变量可能无法使用

时间:2015-09-24 23:32:59

标签: ios afnetworking-2 xcode7

尝试进入AFNetworking代码会生成以下警告:

[Project Name] was compiled with optimization - stepping may behave oddly; variables may not be available.

当然,我无法调试代码。具体而言,我试图调试似乎不可能的UIImageView+AFNetworking类别。更改代码没有任何效果(尝试NSLog等),当尝试进入编译器时转到汇编代码并显示UIImageView+TVASTAFNetworking作为类别名称,这在代码库中的任何地方都不存在。

enter image description here

使用Xcode 7. iOS 9& 8. Cocoapods(无框架)

更新 我忘了提到Optimizer被设置为none用于发布和调试配置,我实际上使用Debug config。

enter image description here

更新2

Strip Debug Symbols也关闭了。

13 个答案:

答案 0 :(得分:149)

如果您的项目使用Swift,则有两个独立的"优化级别"项目/目标配置中的设置。

确保正确设置它们:

  1. 在“项目导航器”窗格中选择项目
  2. 在" PROJECT"下选择项目的设置。树
  3. 点击"构建设置"标签
  4. 搜索"优化级别"并且您将看到两个设置,一个用于LLVM,另一个用于swift。
  5. 为相关的构建配置设置适当的设置(LLVM为None [-O0],Swift为None [-0none]
  6. was compiled with optimization stepping may behave oddlyvariables may not be available

    这样做就解决了我的警告。

答案 1 :(得分:109)

您的项目似乎处于发布模式。发布模式通过大量优化来编译应用程序,但调试器讨厌优化,因此为了可靠地调试应用程序,您需要将其切换到调试模式,这会减少优化并添加一堆调试信息。要将其切换到调试模式:

  • 点击Xcode左上角的方案。

Click on your scheme in the top-left corner of Xcode.

  • 选择"编辑方案..."

Select "Edit Scheme..."

  • 点击"构建配置"落下。并将其更改为调试模式。

Click on the "Build Configuration" dropdown.

答案 2 :(得分:49)

此警告仅在您点击断点并且源位于启用了优化的项目中时出现,从而阻止您观看实际变量值(每个对象显示为nil,即使它不是)

在我的情况下,它只发生在逐步调试cocoapod依赖时。

因此,即使您正确设置了主要目标和项目设置(条带调试符号= OFF,优化级别为无),您也需要确保它与您点击断点的Pod项目相同。

enter image description here

答案 3 :(得分:13)

事实证明,在将旧项目(Xcode 7.x +)导入新的Xcode 8.3(8E162)后,可能由于编译器优化, Swift编译器 - 优化级别默认设置为< strong>快速,单文件优化:

Before

将其更改为无,解决了问题:

after

答案 4 :(得分:11)

Editor - &gt; Validate Settings然后确认所有更改。然后你应该得到Swift Compiler Optimisation Level in place

将Debug设置为None

答案 5 :(得分:8)

这是我的解决方案......

按照gimino的回答,如果您使用的是cocoapods,请在Podfile中添加这样的一行:

xcodeproj 'MyProject', 'Debug - local'=>:debug, 'Debug - staging'=>:debug, 'Debug - PRODUCTION'=>:debug

或cocoapods版本&gt; = 1.0(感谢Diejmon)

project 'MyProject', 'Debug - local'=>:debug, 'Debug - staging'=>:debug, 'Debug - PRODUCTION'=>:debug

MyProject除了标准的'Debug'之外还有'Debug - local','Debug - staging','Debug - PRODUCTION'作为调试配置

默认情况下,cocoapods通常会生成pod配置为Release,这个Podfile行允许你告诉它们是调试。

答案 6 :(得分:7)

我今天遇到了同样的问题,并且弄明白了(至少在我的情况下)。 我也使用CocoaPods,运行我的测试目标时遇到了这个问题(Swift与ObjC混合)。

我正在使用Xcode 7.2,iOS 9.2 SDK。

在下图中,您可以在我的更改之前看到目标和项目的优化:

optimization level before change

令人惊讶的是,即使已解决的优化是无[-O0] ,只有在将项目设置从 -Os 更改为 -O0 <之后/ strong>编译器是否停止优化目标。

下面你可以看到我的最终设置:

optimization level after change

答案 7 :(得分:6)

已经很久了,但我终于解决了这个问题。有第三个优化标记LTOLink Time Optimization,令人惊讶的是没有人 在这里提到它,由于某种原因我也没有注意它。它位于Optimization Level设置之上,您可以在此处发布的许多屏幕截图中看到。

总而言之,您需要关闭3个不同的优化标志进行调试:

  • LLVM链接时间优化(-flto
  • LLVM优化级别(-O
  • Swift编译器优化级别

enter image description here

有关LTO的更多信息: http://llvm.org/docs/LinkTimeOptimization.html

答案 8 :(得分:1)

您确定您的调试配置不会优化代码(它不应该)吗?看起来您不小心为调试配置启用了优化,您应该将其从目标设置中关闭。

答案 9 :(得分:0)

这个错误发生在我身上两次,并且在每种情况下都是用于请求服务的URL参数中的错误。 在一种情况下,URL在端口部分中有一些空间,在另一种情况下,某些可选值未被解包。

所以修复是为了确保请求的url格式正确。有关我的案例的更多信息,以及类似的报告here

答案 10 :(得分:0)

这可能是一个过分的简化,但是您是为Release还是针对优化(从Swift或LLVM中删除符号)而构建的?如果是这样,请编辑方案并切换到“调试”,或将“构建设置”的Swift或LLVM优化编辑为“无(0)”。

答案 11 :(得分:0)

即使在调试内部使用C库的pod的过程中遇到了这个问题,除了线程中列出的所有其他内容之外,您还必须在项目设置中进行其他更改才能使其正常工作。

转到Pods项目设置->您的C使用目标->构建设置-> Apple Clang-自定义编译器标志->其他C标志,并以某种方式删除-O3标志。

答案 12 :(得分:0)

如果您需要为Swift容器禁用优化功能,以便对其进行调试,请将以下内容添加到this中。这将仅对调试版本禁用优化。

RenderItem