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

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

内容简介:在日常开发中,我们经常会在 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 调试时却无法复现,我猜有可能会跟编译优化有关,你觉得呢?欢迎留言讨论。


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

查看所有标签

猜你喜欢:

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

Java5.0Tiger程序高手秘笈

Java5.0Tiger程序高手秘笈

BrettMclaughlin / 东南大学出版社 / 2005-10 / 28.00元

代号为 “Tiger”的下一个 Java 版本,不只是个小改动版。在语言核心中有超过 100 项以上的变动,同时有大量的对 library 与 API 所做的加强,让开发者取得许多新的功能、工具与技术。但在如此多的变化下,应该从何处开始着手?也许可以从既长又无趣的语言规范说明书开始看起;或等待最少 500 页的概念与理论巨著出版;甚至还可以直接把玩新的 JDK 看看能够有什么发现;或者借由《Jav......一起来看看 《Java5.0Tiger程序高手秘笈》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

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

RGB CMYK 互转工具