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

Moj*_*aba 202 ios afnetworking-2 xcode7

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

[Project Name] was compiled with optimization - stepping may behave oddly; variables may not be available.
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

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

在此输入图像描述

更新2

Strip Debug Symbols 也关闭了.

Alb*_*ori 157

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

确保正确设置它们:

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

使用优化步进编译可能表现奇怪的变量可能无法使用

这样做解决了我的警告.


Nob*_*ica 116

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

  • 点击Xcode左上角的方案.

点击Xcode左上角的方案.

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

选择

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

单击

  • 我正在使用调试.确定优化器关闭. (6认同)

Gom*_*ino 56

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

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

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

在此输入图像描述

  • 我知道你说它在你的项目中是关闭的,就像在我的项目中一样,但是你看看你的Pod依赖项目配置了吗? (2认同)
  • 这是不正确的。再次“ pod install”时,它将被覆盖。更改它(像这样)(https://github.com/CocoaPods/CocoaPods/commit/81d3550d719cc7595e9322ee4c6dc2c2ef73893f#commitcomment-24019622)。 (2认同)

val*_*ine 13

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

之前

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

后


jam*_* sa 11

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

将Debug设置为None.


And*_*ves 9

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

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

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

变更前的优化级别

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

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

变更后的优化级别


wil*_*ils 8

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

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

xcodeproj 'MyProject', 'Debug - local'=>:debug, 'Debug - staging'=>:debug, 'Debug - PRODUCTION'=>:debug
Run Code Online (Sandbox Code Playgroud)

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

project 'MyProject', 'Debug - local'=>:debug, 'Debug - staging'=>:debug, 'Debug - PRODUCTION'=>:debug
Run Code Online (Sandbox Code Playgroud)

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

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


小智 7

如果您需要禁用 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
Run Code Online (Sandbox Code Playgroud)


Moj*_*aba 6

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

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

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

在此输入图像描述

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

  • 我做的。不适合我。我在Unity产生的ios版本中遇到此问题。 (2认同)