DTrace может сделать это, но только в симуляторе iPhone (он поддерживается Snow Leopard, но пока не поддерживается iOS).У меня есть две статьи об этой технологии для MacResearch здесь и здесь , где я прохожу некоторые примеры использования DTrace для поиска конкретных методов и при их вызове.
Например, я создал следующий сценарий DTrace, чтобы измерить количество вызовов методов для классов с префиксом CP, а также общее время, затраченное на эти методы:
#pragma D option quiet
#pragma D option aggsortrev
dtrace:::BEGIN
{
printf("Sampling Core Plot methods ... Hit Ctrl-C to end.\n");
starttime = timestamp;
}
objc$target:CP*::entry
{
starttimeformethod[probemod,probefunc] = timestamp;
methodhasenteredatleastonce[probemod,probefunc] = 1;
}
objc$target:CP*::return
/methodhasenteredatleastonce[probemod,probefunc] == 1/
{
this->executiontime = (timestamp - starttimeformethod[probemod,probefunc]) / 1000;
@overallexecutions[probemod,probefunc] = count();
@overallexecutiontime[probemod,probefunc] = sum(this->executiontime);
@averageexecutiontime[probemod,probefunc] = avg(this->executiontime);
}
dtrace:::END
{
milliseconds = (timestamp - starttime) / 1000000;
normalize(@overallexecutiontime, 1000);
printf("Ran for %u ms\n", milliseconds);
printf("%30s %30s %20s %20s %20s\n", "Class", "Method", "Total CPU time (ms)", "Executions", "Average CPU time (us)");
printa("%30s %30s %20@u %20@u %20@u\n", @overallexecutiontime, @overallexecutions, @averageexecutiontime);
}
.следующий красиво отформатированный вывод:
Class Method Total CPU time (ms) Executions Average CPU time (us)
CPLayer -drawInContext: 6995 352 19874
CPPlot -drawInContext: 5312 88 60374
CPScatterPlot -renderAsVectorInContext: 4332 44 98455
CPXYPlotSpace -viewPointForPlotPoint: 3208 4576 701
CPAxis -layoutSublayers 2050 44 46595
CPXYPlotSpace -viewCoordinateForViewLength:linearPlotRange:plotCoordinateValue: 1870 9152
...
Хотя вы можете создавать и запускать сценарии DTrace из командной строки, вероятно, лучше всего было бы создать собственный инструмент в инструментах и ввести соответствующий код D в этом инструменте.,Затем вы можете легко запустить это для своего приложения в симуляторе.
Опять же, это не будет работать на устройстве, но если вы просто хотите получить статистику о количестве вызовов, а не о продолжительностиработает, это может сделать работу.