Вдохновленный ответом tc на похожий вопрос здесь , я собрал действие отладочной точки останова, которое будет регистрировать имя класса и метода каждый раз, когда objc_msgSend () запускается в вашем приложении.Это работает аналогично сценарию DTrace, который я описал в этот ответ .
Чтобы включить это действие точки останова, создайте новую символическую точку останова (в Xcode 4 перейдите к навигатору точек останова и создайте новыйсимволическая точка останова с использованием плюса в левом нижнем углу окна).Установите символ objc_msgSend
, установите его для автоматического продолжения после оценки действий и установите действие в качестве команды отладчика, используя следующее:
printf "[%s %s]\n", (char *)object_getClassName(*(long*)($esp+4)),*(long *)($esp+8)
Ваша точка останова должна выглядеть примерно так:
Это должно выводить подобные сообщения при запуске с вашим приложением:
[UIApplication sharedApplication]
[UIApplication _isClassic]
[NSCFString getCString:maxLength:encoding:]
[UIApplication class]
[SLSMoleculeAppDelegate isSubclassOfClass:]
[SLSMoleculeAppDelegate initialize]
Если вам интересно, откуда я вытащил адреса памяти, прочитайте эта статья Phrack о внутренних объектах Objective-C.Приведенные выше адреса памяти будут работать только на симуляторе, поэтому вам может потребоваться настроить его для работы с приложениями на устройствах iOS.Коллин предлагает следующую модификацию в своем ответе для запуска этого на устройстве:
printf "[%s %s]\n", (char *)object_getClassName($r0),$r1
Кроме того, я думаю, вы увидите, что выход из каждого метода, вызываемого в вашем приложении, сокрушит васс информацией.Возможно, вы сможете использовать некоторые условия для фильтрации этого, но я не знаю, поможет ли это вам узнать, как выполняется ваш код.