'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" 设置。
确保正确设置它们:
- Select 您在“项目导航器”窗格中的项目
- Select "PROJECT" 树下的项目设置
- 单击 "Build Settings" 选项卡
- 搜索 "Optimization Level",您会看到两个设置,一个用于 LLVM,一个用于 swift。
- 为相关构建配置设置适当的设置(
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,解决了问题:
好久没解决了,终于解决了。还有第三个优化标志 LTO
或 Link 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 方案)。
更改这些以使用我的自定义配置删除了运行时优化。
尝试进入 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" 设置。
确保正确设置它们:
- Select 您在“项目导航器”窗格中的项目
- Select "PROJECT" 树下的项目设置
- 单击 "Build Settings" 选项卡
- 搜索 "Optimization Level",您会看到两个设置,一个用于 LLVM,一个用于 swift。
- 为相关构建配置设置适当的设置(
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,解决了问题:
好久没解决了,终于解决了。还有第三个优化标志 LTO
或 Link 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 方案)。
更改这些以使用我的自定义配置删除了运行时优化。