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)
此外,我认为你会看到注销你的应用程序中调用的每个方法都会让你无法获得信息.您可以使用某些条件来过滤它,但我不知道这是否有助于您了解代码的执行方式.
小智 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)
要在设备上跟踪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
| 归档时间: |
|
| 查看次数: |
11793 次 |
| 最近记录: |