【发布时间】:2011-10-18 21:03:50
【问题描述】:
当您调用一个方法时,例如[objectA message:arg1 argument:arg2],参数会发生什么变化?
例如,当您调用一个方法时,该方法的地址被压入调用堆栈。但是争论会发生什么?他们不是也被推到某个堆栈吗?否则,方法的代码怎么知道在哪里找到它的参数?
我问的原因是因为当你得到一个堆栈跟踪时,你会得到按顺序调用的函数或方法的地址。当一个方法或函数返回时,调用它的方法或函数仍然具有对其自身参数的引用。所以我必须在某处引用arg1 和arg2。因此,从 iOS 设备上的堆栈跟踪和堆栈符号中,您必须能够获取调用任何其他方法或函数的方法或函数,并获取其参数。
你如何得到这些论点?
关于另一个问题:objective C log method call,他们展示了一种获取方法的NSMethodSignature 的方法,并使用该方法可以获取参数的数量和类型。
这样,知道参数的位置后,您就可以获取已调用的每个函数或方法以及用于调用它们的参数。
任何帮助将不胜感激。
更新
2011-08-03
作为对“fakeAccount22”cmets 的回复,我想在运行时从应用程序内执行此操作。
我的问题基本上归结为:在运行时和应用程序内,您如何访问 iOS 设备的 Objective-C 中的调用堆栈或堆栈指针? Mac OSX 有什么不同吗?
【问题讨论】:
-
您想在运行时执行此操作吗?还是来自堆栈跟踪?从应用程序内部?还是来自调试器?
-
@fakeAccount22,我想在运行时从应用程序内执行此操作。
-
ios 和 osx 不同。不同型号的 iPhone、iPad 和 iPod 中的各种 arm 处理器是不同的。生成堆栈跟踪是一回事(有内置的方法),访问寄存器值(即堆栈指针)是另一回事。您可能可以使用内联汇编来做到这一点。您将需要对 arm ABI 有一个很好的理解,并理解学习一些反汇编代码。不同类型、结构、浮点数、对象等的值的处理方式不同。您可能必须从内存中的地址反汇编每个函数和方法。
标签: objective-c ios methods callstack