'Project Name' 是经过优化编译的 - 步进可能表现得很奇怪;变量可能不可用

'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 作为代码库中任何地方都不存在的类别名称。

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

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

更新 2

Strip Debug Symbols 也关闭了。

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

您的项目似乎处于发布模式。 Release 模式编译应用程序有很多优化,但调试人员讨厌优化,因此要可靠地调试应用程序,您需要将其切换到 Debug 模式,这会减少优化并添加一堆调试信息。要将其切换到调试模式:

  • 点击 Xcode 左上角的方案。

  • Select "Edit Scheme..."

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

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

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

因此,即使您正确设置了主要目标和项目设置(去除调试符号=OFF,优化级别None),您也需要确保它与您点击的 Pod 项目相同断点来自.

如果您的项目使用 Swift,project/target 配置中有两个单独的 "Optimization Level" 设置。

确保正确设置它们:

  1. Select 您在“项目导航器”窗格中的项目
  2. Select "PROJECT" 树下的项目设置
  3. 单击 "Build Settings" 选项卡
  4. 搜索 "Optimization Level",您会看到两个设置,一个用于 LLVM,一个用于 swift。
  5. 为相关构建配置设置适当的设置(None [-O0] 用于 LLVM,None [-0none] 用于 Swift)。

这样做解决了我的警告。

Editor -> Validate Settings 然后确认所有更改。那么你应该得到

将调试设置为 None

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

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

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

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

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

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

根据 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'

之外,MyProject 还有 'Debug - local'、'Debug - staging'、'Debug - PRODUCTION' 作为调试配置

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

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

因此解决方法是确保请求的 url 格式正确。有关我的案例的更多信息,以及类似的报告相同 here

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

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

好久没解决了,终于解决了。还有第三个优化标志 LTOLink Time Optimization 令人惊讶的是没有人 在这里提到它,出于某种原因我也没有注意它。正如您在此处发布的许多屏幕截图中所见,它就在 Optimization Level 设置上方。

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

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

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

这可能过于简单化了,但是您是为发布构建还是优化(从 Swift 或 LLVM 中删除符号)过高?如果是这样,请编辑您的方案并切换到调试,或将 swift 或 LLVM 优化的构建设置编辑为 None (0).

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

转到 Pods 项目设置 -> 你的 C-using 目标 -> 构建设置 -> Apple Clang - 自定义编译器标志 -> 其他 C 标志并删除到达那里的 -O3 标志不知何故。

如果您需要禁用 Swift pods 的优化以便调试它们,请将以下内容添加到您的 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

就我而言,我为自定义配置(“模拟”)创建了一个新方案,该方案未使用优化,但忽略了该方案的测试和分析上下文,它们仍在使用发布配置(我最初一定是复制了 Release 方案)。

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