2014-06-11 5 views
1

У меня есть метод, который вызвал в моем приложении iPhone в непредвиденное время, и я не могу понять, какой код его вызывает. Есть ли способ найти это из метода Objective C или функции Xcode? В основном ...Как узнать, какой код вызывает метод?

- (void)myMethod { 
    NSLog(@"who just called me?"); 
} 

Этот метод вызывается из множества мест в моем коде, так что просто ищет имя метода не сужать его вниз достаточно. Я мог бы временно добавить аргумент к методу, а затем отредактировать каждый вызов метода, чтобы добавить уникальный идентификатор в качестве аргумента, но для этого потребуется много изменений, а затем отмените все изменения, когда я закончу.

В идеале я бы нашел номер класса и строки кода, который вызвал этот метод. Мне не нужно использовать эту информацию в методе, мне просто нужно ее для отладки.

ответ

4

Если вы используете приложение через Xcode, просто установите контрольную точку в своем myMethod и запустите приложение. Когда точка останова достигнута, приложение остановится, и отладчик покажет вам трассировку стека, ведущую к вызову метода. Затем вы можете точно видеть, что происходит.

Не нужно регистрировать трассировку стека. Посмотрите в режиме реального времени с помощью отладчика.

+0

Думаю, я делал это более сложным, чем нужно. Это работает отлично. Чтобы уточнить, когда приложение приостанавливается, я могу ввести bt в консоль или щелкнуть значок «spool of thread» между окном кода и консольным окном, чтобы просмотреть список потоков и трассировку стека для каждого потока. – arlomedia

+0

Да. Отладчик покажет вам текущую трассировку стека в левой панели Xcode. Или вы можете вводить команды в окно отладчика. – rmaddy

6

Вы можете войти стек вызовов, чтобы увидеть, откуда метод был вызван

- (void)myMethod { 
    NSLog(@"who just called me? %@", [NSThread callStackSymbols]); 
} 
+0

Подтверждено - это сработало, когда я попробовал. Но ответ rmdaddy был еще проще. :-) – arlomedia

0

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

- (void)myMethod { 
    NSLog(@"who just called me?"); 
    [self nonexistentMethod]; 
} 

Затем после сбоев приложений, типа bt в консоли Xcode, чтобы получить трассировку. Оттуда я вижу последние несколько методов, которые вызывались до этого. Это уродливо, но оно работает. Есть ли способ лучше?

+0

зарегистрируйте стек вызовов в MyMethod. –

2

Xcode дает нам отличную функцию «Break Point», вам просто нужно поставить точку останова в нашем методе, и вы можете увидеть, где находится контроль.

Смежные вопросы