Условная точка останова XCode / Objective C на основе вызывающего абонента

#iphone #objective-c #ios #nslog

#iPhone #objective-c #iOS #nslog

Вопрос:

Хорошо, у меня есть требование установить точку останова, которая получает «попадание» только тогда, когда метод вызывается (или не вызывается) определенным объектом и / или селектором

самый простой способ, который я могу придумать, это сделать, если бы существовал какой-нибудь макрос компилятора (например, _cmd), который разворачивает стек и возвращает идентификатор и селектор непосредственного вызывающего текущего метода.

например, предполагая, что основными макросами были _cmd_caller_id и _cmd_caller_sel) —

 if ( (_cmd_caller_id == self) amp;amp; (_cmd_caller_sel != @selector(some_method:signature:) ) {
   NSLog(@"called by %@ - hitting breakpoint",NSStringFromSelector(_cmd_caller_sel));
}
  

(и вы бы поставили точку останова в строке, содержащей NSLog(…); );

причина в том, что у меня есть метод, который вызывается много раз, и мне нужно иметь возможность настроить более сложный набор условий, чем я описал выше, чтобы установить ловушку, чтобы определить, какой метод вызывает метод-нарушитель и когда.

Ответ №1:

Установите свою точку останова на вызывающем сайте с условием для точки останова (например, self == что угодно)

Комментарии:

1. да, я решил эту проблему другим способом (работая в обратном направлении). однако в некоторых случаях у вас нет источника для вызывающего сайта — я пытался отследить, откуда исходило ложное сохранение. было бы неплохо иметь возможность разматывать стек, но я думаю, что это на другой день.

2. Если вы хотите выяснить, откуда берутся дополнительные сохранения, используйте инструменты, а не GDB.

3. обычно я бы согласился с вами, однако я работаю над чем-то, что требует анализа в реальном времени. т. Е. снижение производительности инструментов неприемлемо. (т. Е. я выполняю много числовых операций с сэмплами звука в реальном времени перед воспроизведением)