“项目名称”经过优化编译-步进可能会出现奇怪的情况;变量可能不可用


210

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

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

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

在此处输入图片说明

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

更新 我忘了提到none针对发布和调试配置,Optimizer都设置为,实际上我正在使用Debugconfig。

在此处输入图片说明

更新2

Strip Debug Symbols 也一样。


我记得有某种“ Strip Debug Symbols”选项。那可能会导致这个问题。好吗
NobodyNada2015年

1
@NobodyNada是Strip Debug Symbols的。
Mojtaba

很奇怪,我只是尝试打开Strip Debug Symbol,警告消失了8- |
Gomino 2015年

@Mojtaba嘿,您是否找到解决问题的方法?自从更新到Xcode 7以来,我一直
遇到

@哈杜:不幸的是没有
Mojtaba

Answers:


175

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

确保正确设置它们:

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

通过优化步进进行编译可能表现为奇数变量,可能不可用

这样做为我解决了该警告。


1
混合语言项目怎么办...?
Vive

LLVM和Swift有什么区别?难道斯威夫特是我在这个项目中写道和LLVM是什么我做的问候像在调试器,即事物的调试popexpr...?
亲爱的

124

您的项目似乎处于发布模式。发布模式对应用程序进行了很多优化,但是调试器讨厌优化,因此要可靠地调试应用程序,您需要将其切换到调试模式,这会减少优化并添加大量调试信息。要将其切换到调试模式:

  • 单击Xco​​de左上角的方案。

单击Xco​​de左上角的方案。

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

选择“编辑方案...”

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

单击“构建配置”下拉列表。


8
我正在使用调试。并确保优化程序已关闭。
Mojtaba

这很有趣。也因为我已经将它设置为发布模式,我的一些断点没有得到命中,而其他一些人击中_(ツ)_ /¯
蜂蜜

59

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

就我而言,它仅在逐步调试cocoapod依赖项时发生。

因此,即使您正确设置了主要目标和项目设置(Strip Debug Symbol = OFF,并且优化级别为None),也需要确保与击中断点的Pod项目相同。

在此处输入图片说明


阅读其他答案,他们建议相同。但在我的专案(aka None [-O0])中全都关闭了
Mojtaba 2015年

2
我知道您说过它在我的项目中已经关闭,就像在我的项目中一样,但是您是否查看了Pod依赖项项目的配置?
Gomino 2015年

Xcode 7也有同样的问题。当我开始使用trachkerbird库时,可能出现了问题。但是断点在我自己的代码中。
迈克

1
对于Pods项目,将“项目”优化级别设置更改为“无”。(对于任何广告连播目标均未更改)。
哎呀,2016年

2
这是不正确的。当您pod install再次使用它时,它将被覆盖。像这样改变它。
Iulian Onofrei

13

事实证明,将旧项目(Xcode 7.x +)导入新的Xcode 8.3(8E162)后,可能是由于编译器优化所致,默认情况下,Swift Compiler-Optimization Level设置为Fast,Single-File Optimization

之前

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

后


我做的。不适合我。我在Unity产生的ios版本中遇到此问题。
Chandni

11

Editor-> Validate Settings然后确认所有更改。那你应该得到快速的编译器优化级别

将“调试”设置为None


1
我做的。不适合我。我在Unity产生的ios版本中遇到此问题。
Chandni

9

这是我的解决方案...

按照gimino的回答,如果您使用的是椰壳足,请将以下内容添加到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”之外,MyProject还具有“ Debug-local”,“ Debug-staging”,“ Debug-PRODUCTION”作为调试配置

默认情况下,cocoapods通常会生成Pod配置作为Release,此Podfile行允许您告诉他们它们是调试状态。


9

我今天遇到了同样的问题,并弄清楚了(至少就我而言)。我也在使用CocoaPods,在运行测试目标(Swift与ObjC混合使用)时遇到了这个问题。

我正在将Xcode 7.2与iOS 9.2 SDK配合使用。

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

更改前的优化级别

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

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

更改后的优化级别


7

已经很长时间了,但我终于解决了这个问题。还有第三个优化标志,LTO或者Link Time Optimization令人惊讶的是,这里没有人提及它,由于某种原因,我也没有注意它。Optimization Level您可以在此处张贴的许多屏幕截图中看到,它位于设置上方。

因此,总结一下,您需要关闭3个不同的优化标记以进行调试:

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

在此处输入图片说明

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


2
我做的。不适合我。我在Unity产生的ios版本中遇到此问题。
Chandni

@Chandni,在这里我遇到了同样的问题,您找到了解决方案吗?
拉尼亚尼

2

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

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      if config.name == "Debug"
        config.build_settings["SWIFT_OPTIMIZATION_LEVEL"] = "-Onone"
      end
    end
  end
end

1

您确定调试配置不会优化代码吗?您似乎意外地启用了调试配置优化功能,应该从目标设置中将其关闭。


3
优化关闭了一切。甚至发布版本只是为了确保
Mojtaba

@Mojtba但是发布模式开启了优化功能!
NobodyNada15年

0

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

因此,解决方法是确保请求的网址格式正确。有关我的案件的更多信息,此处类似报道。


0

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


0

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


0

万一有人在调试内部使用C库的pod时遇到了这个问题,除了线程中列出的所有其他内容外,您还必须更改项目设置以使其正常工作,这是另一件事。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.