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

问题描述 投票:191回答:13

尝试进入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配置。

enter image description here

更新2

Strip Debug Symbols也关闭了。

ios afnetworking-2 xcode7
13个回答
151
投票

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

确保正确设置它们:

  1. 在Project Navigator窗格中选择项目
  2. 在“PROJECT”树下选择项目的设置
  3. 单击“构建设置”选项卡
  4. 搜索“优化级别”,您将看到两个设置,一个用于LLVM,另一个用于swift。
  5. 为相关的构建配置设置适当的设置(针对LLVM的None [-O0]和针对Swift的None [-0none])。

was compiled with optimization stepping may behave oddlyvariables may not be available

这样做解决了我的警告。


0
投票

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

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


0
投票

我所做的就是清理(Product > Clean)我的项目并再次运行它


0
投票

这可能过于简单了,但是您是为Release或优化(从Swift或LLVM中删除符号)构建得太高了吗?如果是,请编辑您的方案并切换到Debug,或将swift或LLVM优化的Build Settings编辑为None(0)。


0
投票

为了防止有人在调试内部使用C库的pod时遇到此问题,除了线程中列出的所有其他内容之外,还需要在项目设置中进行更改以使其工作。

转到Pods项目设置 - >你的C-using目标 - > Build Settings - > Apple Clang - Custom Compiler Flags - > Other C Flags并删除以某种方式到达那里的-O3标志。


111
投票

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

  • 点击Xcode左上角的方案。

  • 选择“编辑方案...”

  • 单击“构建配置”下拉列表。并将其更改为调试模式。


52
投票

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

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

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

enter image description here


13
投票

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

Before

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

after


11
投票

Editor - > Validate Settings然后确认所有变化。然后你应该得到Swift Compiler Optimisation Level in place

将Debug设置为None


8
投票

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

根据gimino的回答,如果您使用cocoapods,请在Podfile中添加如下行:

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

或者对于cocoapods版本> = 1.0(感谢Diejmon)

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

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

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


7
投票

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

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

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

optimization level before change

令人惊讶的是,即使已解析的优化为无[-O0],只有在将项目设置从-Os更改为-O0后,编译器才会停止优化目标。

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

optimization level after change


6
投票

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

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

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

enter image description here

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.