2010-09-24 61 views
7

我真的很希望看到方法,委托,通知等等,当我在iPhone模拟器中运行我的应用程序时被调用/发送。我认为正确的地方是在调试器中,但我找不到合适的设置。当我在iPhone模拟器中运行我的应用程序时,如何查看每个调用的方法?

我的目标是查看所有在后台发生的事情,例如,向UITableView添加一行或从我的UINavigationController中按下“后退”按钮。

这将是一个很大的帮助,以弄清事情的时候在应用程序正在发生或当用户按下一个按钮,改变视图等

使用什么委托是有可能得到这个信息?

回答

8

您可以注销当您的应用程序运行时使用DTrace进行的所有操作,这个框架可以让您探索在现代Mac上运行的任何内部工作。我们还没有iOS上的DTrace,但它可以在模拟器中运行时运行。

我在this article的MacResearch中描述DTrace的基本原理,然后提供一个自定义乐器的示例,您可以使用DTrace在this article末尾附近使用DTrace生成的自定义乐器。该仪器从您的应用程序启动到登录-applicationDidFinishLaunching:结束时,会注销所有对象(甚至是内部系统对象)上调用的所有方法。

为简化操作,您可以使用乐器中的Instrument | Build New Instrument菜单项简单地创建自定义乐器。设置探头描述的一个类似如下:

alt text

只是忽略isInApplicationStart和时间戳记录选项。一个简单的探测器响应任何类中的任何Objective-C方法都会将所有这些消息记录到仪器控制台,这听起来就像您希望调试的那样。

+0

感谢您的回答!当我找到时间的时候,我也会尝试。抱歉耽搁了! – Micko 2010-09-25 12:40:09

+0

它给了我一个致命的错误。任何想法 – ramo 2014-05-23 20:16:52

0

如果您在应用程序中放置断点,则可以在逐步执行代码时观察调用堆栈的更改。这可能与你想要得到的结果一致。

+0

这是正确的方向,但它仍然不会给你所有发生的事情。还有其他的吗? – Micko 2010-09-24 23:20:03

+0

你可以在main()的第一行放置一个断点,逐字地逐行遍历每一行代码,并且每进入一次框架调用。我不知道你还能看到更多的东西。 – 2010-09-27 11:23:40

5

假设你确定要绝对一切 ...

  1. 断点objc_msgSendobjc_msgSend_stret差不多所有的方法调用都使用这两个函数(嘟IMP IMP-cacheing)。
  2. 好的,现在你的应用程序一直都在调试器中。因此点击自动继续框。
  3. 但是现在你看不到很多事情发生,所以编辑断点并添加命令“bt”以获得回溯。
  4. 淹没在调试垃圾邮件中。

这当然不会捕获其他C函数。

如果你只是想赶上通知,你可以做这样的事情(更垃圾):

+(void)load 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleEveryNotification:) name:nil object:nil]; 
} 

+(void)handleEveryNotification:(NSNotification*)notification 
{ 
    CFShow(notification); 
} 

当然,通知与常规方法调用来完成的,因此第一种方法也将展示他们(虽然在一大堆垃圾邮件中)。

代表未被呼叫或发送;它们只是普通的Obj-C方法调用(严格来说就是“消息发送”,但它与它没有相同的环)。

+0

谢谢你的回答!当我找到时间时,我会尝试。抱歉耽搁了! – Micko 2010-09-25 12:37:11

+0

是否有可能捕获其他C函数? – 2013-03-07 04:10:42

+0

@BenDowling当然:断点每个函数入口点。找到这些会更困难一些。 – 2013-03-07 04:14:00

相关问题