如何记录iOS应用程序中使用的所有方法

Phi*_*ohn 44 iphone instruments ipad ios

我正在为客户开发一款iPad应用程序.有大量的工作已经完成,我正在努力拼凑整个设计的运行方式.

我想做的其中一件事是记录应用程序运行时调用哪些方法.我见过一个自定义DTrace脚本,它意味着记录启动时的所有方法,但是当我在Instruments中运行它时,我没有得到任何结果.

记录方法的最佳方法是什么?

Bra*_*son 55

受到tc对这里类似问题的回答的启发,我整理了一个调试断点操作,该操作将在应用程序中每次触发objc_msgSend()时注销类和方法名称.这与我在本回答中描述的DTrace脚本类似.

要启用此断点操作,请创建一个新的符号断点(在Xcode 4中,转到断点导航器并使用窗口左下角的加号创建一个新的符号断点).使用符号objc_msgSend,将其设置为在评估操作后自动继续,并使用以下操作将操作设置为调试器命令:

printf "[%s %s]\n", (char *)object_getClassName(*(long*)($esp+4)),*(long *)($esp+8)
Run Code Online (Sandbox Code Playgroud)

您的断点应如下所示:

断点动作

这应该在针对您的应用程序运行时注销这样的消息:

[UIApplication sharedApplication]
[UIApplication _isClassic]
[NSCFString getCString:maxLength:encoding:]
[UIApplication class]
[SLSMoleculeAppDelegate isSubclassOfClass:]
[SLSMoleculeAppDelegate initialize]
Run Code Online (Sandbox Code Playgroud)

如果您想知道我在何处提取内存地址,请阅读有关Objective-C运行时内部的Phrack文章.上面的内存地址只能用于模拟器,因此您可能需要调整它以针对iOS设备上的应用程序运行.科林提出以下修改在他的回答在设备上运行以下命令:

printf "[%s %s]\n", (char *)object_getClassName($r0),$r1
Run Code Online (Sandbox Code Playgroud)

此外,我认为你会看到注销你的应用程序中调用的每个方法都会让你无法获得信息.您可以使用某些条件来过滤它,但我不知道这是否有助于您了解代码的执行方式.

  • 在xcode 4中尝试这个并得到这个"错误:'printf'不是一个有效的命令." (5认同)
  • 好主意,但是当你运行它时,你说有点压倒性的. (2认同)
  • 在断点设置的情况下,有没有办法避免系统调用? (2认同)

小智 19

如果使用LLDB,则需要使用以下调试器命令.这些在Xcode 4.6中进行了测试.

设备:

expr -- (void) printf("[%s %s]\n", (char *)object_getClassName($r0),$r1)
Run Code Online (Sandbox Code Playgroud)

模拟器:

expr -- (void) printf("[%s %s]\n", (char *)object_getClassName(*(long*)($esp+4)), *(long *)($esp+8))
Run Code Online (Sandbox Code Playgroud)

  • 在ARM64上,这需要是`expr - (void)printf("[%s%s] \n",(char*)object_getClassName($ x0),$ x1)`. (3认同)
  • 这在XCode 6.1中失败,并显示以下消息:`进程已返回到表达式求值之前的状态.错误:执行被中断,原因:尝试取消引用无效指针.任何想法如何修改语句以使其起作用? (2认同)

Zmi*_*nka 6

要在设备上跟踪Xcode 6下的应用程序代码,我必须使用以下调试器表达式.

expr -- (void) printf("[%s %s]\n", (char *)object_getClassName($arg1),$arg2)
Run Code Online (Sandbox Code Playgroud)


小智 5

可以使用debugger命令将Brad Larson的方法调整为在设备上运行:

printf "[%s %s]\n", (char *)object_getClassName($r0),$r1
Run Code Online (Sandbox Code Playgroud)

可以在此处的技术说明中找到更多信息:technotes