在Xcode运行App时获取指定变量值的方法
如何在Xcode无断点运行时获取指定变量的值
当然有可行的办法!既然你的App已经连接Xcode并处于运行状态,完全可以借助LLDB(Xcode内置的调试器)的命令来读取指定变量的值,不需要设置断点就能实现。下面是几种实用的操作方式:
直接读取已知作用域内的变量
如果你清楚变量的名称,且它在当前线程的可访问作用域内,直接在Xcode底部的调试控制台输入以下命令即可:- 对于OC/Swift对象,用
po(print object的简写)命令,会输出对象的友好描述:po 你的变量名 - 对于基本数据类型(比如Int、Bool),用
p或e(expression的简写)命令,会输出原始值:p 你的变量名
- 对于OC/Swift对象,用
读取页面控制器中的实例变量
如果变量在当前显示的ViewController里,你可以先定位到这个控制器实例,再逐层访问变量。比如:- 先获取当前根控制器:
po UIApplication.shared.keyWindow?.rootViewController - 如果当前页面是自定义的
UserProfileVC,里面有个实例变量currentUser,可以直接强转后访问:po (UserProfileVC *)UIApplication.shared.keyWindow?.rootViewController.currentUser
(Swift环境下注意加上模块名,比如
po MyApp.UserProfileVC.currentUser,如果是实例属性需要确保拿到正确的实例)- 先获取当前根控制器:
用
frame variable读取栈帧变量
如果你不确定变量所在的栈帧,可以先通过thread backtrace查看当前线程的栈帧列表,然后用frame select <帧编号>切换到目标栈帧,再用fr v(frame variable的简写)读取变量:fr v 你的变量名这个命令只会读取变量值,不会像
expression那样可能触发代码执行,更安全。
注意事项
- 确保你的App处于Debug模式,Release模式下编译器可能会优化掉一些变量,导致无法读取。
- 如果是私有变量,OC中通常需要加上下划线前缀(比如
_privateVar),Swift中可能需要通过模块名访问私有属性。 - 如果变量不在当前线程的作用域内,需要先找到对应的对象实例,再访问其属性。
内容的提问来源于stack exchange,提问作者Nevin Jethmalani
相关产品推荐
相关产品推荐

