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

Mic*_*cko 7 iphone

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

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

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

是否有可能获得此信息?

Bra*_*son 8

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

我描述的DTrace的基本面本文为MacResearch,然后提供你可以建立在使用DTrace附近的高端仪器的自定义仪器的例子这篇文章.该文书注销所有要求的那一刻起所有对象(甚至系统内部的)方法的应用程序启动,直到它击中结束-applicationDidFinishLaunching:.

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

替代文字

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


tc.*_*tc. 5

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

  1. 断点objc_msgSendobjc_msgSend_stret.几乎所有方法调用都使用这两个函数(mumble mumble 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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