当我在iPhone模拟器中运行应用程序时,如何查看调用的每个方法?

时间:2010-09-24 20:34:57

标签: iphone

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

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

这将有助于弄清楚当应用程序中的某些内容发生时,或者当用户按下按钮,更改视图等时要使用的委托。

是否可以获取此信息?

3 个答案:

答案 0 :(得分:8)

您可以使用DTrace注销应用程序运行时发生的所有事情,DTrace是一个框架,可让您探索在现代Mac上运行的任何内容的内部工作方式。我们在iOS上还没有DTrace,但是当你在模拟器中运行时它会工作。

我在this article中为MacResearch描述了DTrace的基础知识,然后提供了一个自定义工具的示例,您可以在this article末尾附近使用DTrace构建自定义工具。从应用程序启动到结束-applicationDidFinishLaunching:结束时,该工具会记录所有对象(甚至是内部系统对象)上调用的所有方法。

为简化此操作,您只需使用乐器中的Instrument | Build New Instrument菜单项创建自定义乐器即可。设置其中一个探测描述符,如下所示:

alt text

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

答案 1 :(得分:5)

假设您确定绝对是一切 ...

  1. 断点objc_msgSendobjc_msgSend_stret几乎所有方法调用都使用这两个函数(mumble mumble IMP-cacheing)。
  2. 好的,现在你的应用程序一直都会进入调试器。因此,请单击自动继续框。
  3. 但现在你看不到很多事情,所以编辑断点并添加命令“bt”以获得回溯。
  4. 淹没调试垃圾邮件。
  5. 当然,这不会捕获其他C函数。

    如果你只想捕捉通知,你可以做这样的事情(更不用说垃圾邮件了):

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

    当然,通知是通过常规方法调用完成的,因此第一种方法也会显示它们(虽然是一大堆垃圾邮件)。

    代表不会被打电话或发送;它们只是正常的Obj-C方法调用(严格来说是“消息发送”,但它没有相同的响铃)。

答案 2 :(得分:0)

如果在应用程序中放置断点,则可以在单步执行代码时观察调用堆栈的更改。这可能就像你想要的那样接近。