Xcode 断点调试时打印变量值报错的问题(编译优化相关)

栏目: 编程工具 · IOS · 发布时间: 6年前

内容简介:在日常开发中,我们经常会在 Debug 模式下打断点进行调试,并通过 LLDB 的今天在 Release 模式下编译运行项目,发现要打印某一变量的值时(大致意思是说,

在日常开发中,我们经常会在 Debug 模式下打断点进行调试,并通过 LLDB 的 po 命令在控制台打印一些变量的值,以方便排查问题。

今天在 Release 模式下编译运行项目,发现要打印某一变量的值时( po xxx ),报如下错误:

error: Couldn't materialize: couldn't get the value of variable xxx: no location, value may have been optimized out
error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression

大致意思是说, xxx 的值不存在,可能已经被编译优化了。而且在断点模式下当我们把鼠标的箭头移到某一变量上要进行快速浏览时,发现它们的值都是 nil

查了一下才发现,原来这与 Xcode 工程的编译选项 Optimization Level 设置有关,它是指编译器的优化级别,优化后的代码效率比较高,但是可读性比较差,且编译时间更长,它有 6 个选项值如下图:

Xcode 断点调试时打印变量值报错的问题(编译优化相关)

上述每选项值的详细说明可以参考 《Xcode 中 Optimization Level 的设置》《如何加快编译速度》 两篇文章,我们这里不再赘述。

Xcode 工程的 Optimization Level 值在 Debug 模式下默认为 None [-O0] ,表示编译器不会尝试优化代码,保证调试时输出期望的结果;而在 Release 模式下默认为 Fastest, Smallest[-Os] ,表示编译器将执行所有优化,且不会增加代码的长度,它是可执行文件占用更少内存的首选方案。

这也是为什么我们在 Release 模式下断点打印变量会报错,因为编译器已经给代码做了优化,它将不在调试时记录变量的值了。

此外,有时候遇到一些线上 Bug 但是在 Debug 调试时却无法复现,我猜有可能会跟编译优化有关,你觉得呢?欢迎留言讨论。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Learning Processing

Learning Processing

Daniel Shiffman / Morgan Kaufmann / 2008-08-15 / USD 49.95

Book Description Teaches graphic artists the fundamentals of computer programming within a visual playground! Product Description This book introduces programming concepts in the context of c......一起来看看 《Learning Processing》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具