Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Objective-C运行时动态访问局部变量_Objective C_Xcode_Lldb_Foundation_Objective C Runtime - Fatal编程技术网

在Objective-C运行时动态访问局部变量

在Objective-C运行时动态访问局部变量,objective-c,xcode,lldb,foundation,objective-c-runtime,Objective C,Xcode,Lldb,Foundation,Objective C Runtime,通过Xcode连接到调试器时,LLDB提供了局部变量的有用视图(屏幕截图左下角): 我发现了一个LLDB命令帧变量(和gdb的信息局部变量),它提供了局部变量列表(如上面屏幕截图的右侧所示) 我希望这个功能可以在运行时在设备上执行。例如,我可以使用backtrace\u symbols()、通过\u cmd访问当前选择器以及其他一些方法来访问堆栈跟踪 有人有这方面的经验吗?提前感谢。Xcode/LLDB可以向您显示此信息,因为他们可以访问二进制文件中的调试信息,称为符号表,这有助于它了解哪些内

通过Xcode连接到调试器时,LLDB提供了局部变量的有用视图(屏幕截图左下角):

我发现了一个LLDB命令
帧变量
(和gdb的
信息局部变量
),它提供了局部变量列表(如上面屏幕截图的右侧所示)

我希望这个功能可以在运行时在设备上执行。例如,我可以使用
backtrace\u symbols()
、通过
\u cmd
访问当前选择器以及其他一些方法来访问堆栈跟踪


有人有这方面的经验吗?提前感谢。

Xcode/LLDB可以向您显示此信息,因为他们可以访问二进制文件中的调试信息,称为符号表,这有助于它了解哪些内存位置对应于源代码中的哪些名称。这一切都在Objective-C运行时之外,运行时中没有接口可以访问它

不过,这不起作用还有另一个原因。当您构建要在调试器中运行的代码时,编译器优化被关闭,因此代码中引用的所有变量都在那里

但是,当您构建发布版时,通常编译器优化会进入其中,并重新安排所有仔细命名的局部变量,以使运行更快。它们甚至可能永远不会存储在内存中,只存储在CPU寄存器中。或者它们可能根本不存在,如果优化器能够向自己证明它不需要它们


我的建议是再考虑一下您试图解决的更大的问题…

Xcode/LLDB可以向您显示此信息,因为它们可以访问二进制文件中的调试信息,称为符号表,这有助于它了解哪些内存位置对应于源代码中的哪些名称。这一切都在Objective-C运行时之外,运行时中没有接口可以访问它

不过,这不起作用还有另一个原因。当您构建要在调试器中运行的代码时,编译器优化被关闭,因此代码中引用的所有变量都在那里

但是,当您构建发布版时,通常编译器优化会进入其中,并重新安排所有仔细命名的局部变量,以使运行更快。它们甚至可能永远不会存储在内存中,只存储在CPU寄存器中。或者它们可能根本不存在,如果优化器能够向自己证明它不需要它们


我的建议是再考虑一下您试图解决的更大的问题…

仅使用objective-c运行时无法以类似于调试器的方式访问局部变量(我不太清楚您为什么要这样做)。LLDB/GDB依赖于二进制文件发布版本中缺少的调试信息。仅使用objective-c运行时无法以类似于调试器的方式访问局部变量(我不太清楚您为什么要这样做)。LLDB/GDB依赖于二进制文件的发行版本中将丢失的调试信息。