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

尝试进入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(无框架)

<强>更新 我忘记提到优化器被设置为none用于发布和调试配置,我实际上使用Debug config.

enter image description here

更新 2

Strip Debug Symbols也是关闭的。

108761 次浏览

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

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

  • 点击Xcode左上角的方案。

点击Xcode左上角的方案。

  • 选择“编辑方案…”

Select

  • 点击“Build Configuration”下拉菜单。并将其更改为调试模式。

点击

此警告仅在遇到断点但源位于已启用优化的项目中时出现。这阻止了你观察真正的变量值(每个对象都显示为nil,即使它不是)

你在使用CocoaPods吗?

在我的例子中,它只在通过cocoapod依赖项一步一步地调试时发生。

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

enter image description here

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

确保你把它们都设置正确:

  1. 在project Navigator窗格中选择您的项目
  2. 在“project”树下选择项目的设置
  3. 点击“构建设置”页签
  4. 搜索“优化级别”,你会看到两个设置,一个是LLVM,一个是swift。
  5. 为有关的构建配置设置适当的设置(LLVM为None [-O0], Swift为None [-0none])。

was compiled with optimization stepping may behave odlyvariables may not be available .

这样做解决了我的警告。

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

将Debug设置为None

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

我使用的是Xcode 7.2, iOS 9.2 SDK。

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

优化级别之前的变化

令人惊讶的是,即使解析的优化是没有[o0],只有在将项目设置从操作系统更改为o0之后,编译器才停止优化目标。

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

优化级别后的变化

这就是我的解决方案……

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

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

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

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

其中MyProject有“调试-本地”,“调试-分期”,“调试-生产”作为调试配置,除了标准的“调试”

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

这个错误发生在我身上两次,每次都是用于请求服务的URL参数的错误。 在一种情况下,URL在端口部分有一些空间,在另一种情况下,一些可选值没有被打开。< / p >

因此,解决方案是确保请求的url格式良好。更多关于我的情况的信息,和类似的报告相同在这里

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

Before

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

after

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

总结一下,你需要关闭3个不同的优化标志进行调试:

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

enter image description here

更多关于LTO的信息: http://llvm.org/docs/LinkTimeOptimization.html < / p >

这可能是一个过度简化,但你是否为发布或优化(从Swift或LLVM中删除符号)构建太高了?如果是这样,编辑您的方案并切换到调试,或编辑您的构建设置为None(0),以进行swift或LLVM优化。

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

转到Pods项目设置-> Your C-using target -> Build settings -> Apple Clang - Custom Compiler Flags -> Other C Flags并删除以某种方式获得的-O3标志。

如果你需要禁用你的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

在我的例子中,我为一个自定义配置(“Mock"”)创建了一个新方案,它没有使用优化,但忽略了方案的测试和分析上下文,它仍然使用发布配置(我最初必须复制发布方案)。

将这些更改为使用我的自定义配置删除了运行时优化。

.

如果你使用cocoapods和Objc,把下面的代码放在你的Podfile中,它适用于我的情况,注意选择config.name进行调试,不要更改Release

post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if config.name == 'Test'
config.build_settings['GCC_OPTIMIZATION_LEVEL'] = 0
end
end
end
end