Вторжение в отладчик на iPhone
Для макросов assert в моем iPhone-проекте я ищу способ программного взлома в отладчик. В Windows (MSVС++) для этой цели я могу использовать __debugbreak(). Вызов этой функции остановит мою программу, запустит отладчик и отобразит столбец строки, который вызвал __debugbreak().
Есть ли что-то похожее на __debugbreak() для iPhone? Я пробовал Debugger(), но это дает мне ошибку компоновщика.
Спасибо,
Клаус
Ответы
Ответ 1
изменить
Оказывается, это также работает:
#define Debugger() { raise( SIGINT ) ; }
Я думаю, что это тот же принцип.
Я использую это:
#define Debugger() { kill( getpid(), SIGINT ) ; }
Я думаю, что это работает
в симуляторе и на устройстве.. сборка не требуется!
Ответ 2
Помощник на форуме разработчиков Apple дал мне совет по использованию asm("trap")
при работе на устройстве и asm("int3")
при работе на симуляторе. Это заставляет программу ломаться в отладчик, если вы запустили свою программу в режиме отладки (Option-Command-Y).
(__builtin_trap()
также ломается в отладчик, но вы не можете продолжить потом. assert(false)
завершает программу сообщением, но не врывается в отладчик.)
Ответ 3
Сначала добавьте -DDEBUG
в OTHER_CFLAGS
в свою цель отладки; это будет определять символ DEBUG
при построении отладочной сборки.
Затем добавьте простой макрос assert в заголовок префикса:
#ifdef DEBUG
#define MyAssert(val) _MyAssert(val)
#else
#define MyAssert(val) do { } while(0)
#endif
Далее создайте функцию _MyAssert
в модуле где-нибудь:
#ifdef DEBUG
void _MyAssert(int expression)
{
if (expression == 0) {
NSLog(@"Assertion failed!"); // Place breakpoint here
}
}
#endif
Наконец, создайте точку останова на строке NSLog
.
Ответ 4
Я просто установил точку останова в том месте, где хочу остановиться. Xcode постоянно запоминает точки останова, поэтому в любое время, когда я запускаю приложение с помощью gdb, он остановится в этот момент.
Если вы хотите сломать ошибки утверждения, хорошим местом для установки точки останова является функция objc_exception_throw, в среде выполнения Objective-C, которая на самом деле генерирует исключение. Используйте окно Run > Show > Breakpoints и дважды щелкните строку "Double-click for symbol", затем введите имя.
Ответ 5
Проверить условные точки останова:
http://www.cocoabuilder.com/archive/message/xcode/2008/10/22/25358
Ответ 6
Что-то не так с простым макросом assert()? Что-то вроде
assert(pointerToTest != nil);
остановит ваш процесс в этой точке, если условие неверно. Если вы работаете под отладчиком, вам будет представлена трассировка стека вызовов, которая привела к неудачному утверждению. Если вы хотите запускать его каждый раз, когда вы нажимаете определенный код, вы можете сделать
assert(false);
Я считаю, что эти утверждения чрезвычайно полезны для проверки того, что все IBOutlets не равны нулю, когда окно или представление воспитываются из NIB.
Ответ 7
Если вы запустите свою программу в отладке, ваше приложение должно запустить отладчик, когда оно достигнет недопустимого утверждения.
Чтобы остановить, как пытался сказать Йенс Альфке, вам нужно включить "Остановить на Objective-C Исключения" (в меню "Выполнить" ).
Для получения дополнительной информации об отладке и выпуске и утверждениях читайте http://myok12.wordpress.com/2010/10/10/to-use-or-not-to-use-assertions/
Ответ 8
См. мой ответ fooobar.com/questions/316246/...
Он рассказывает вам, как входить в отладчик, останавливаясь на правильной строке правильного фрейма стека, используя некоторые встроенные макросы ассемблера.
Ответ 9
В то время как древняя нить, нашел это, исследуя ту же тему для Xcode 7. Что для меня решило, это была функция, называемая "Create Exception Breakpoint..."
Отладкa > Точки остановa > Создать точку останова исключения...
Это ставит особую точку останова в навигаторе точки останова (в разделе "Вид" > "Навигаторы" > "Показать навигатор точки останова" ).
![панель навигации точки останова, отображающая все точки останова исключений]()
Это нарушает фактический выброс исключения:
[ exception raise ]
не прерывая выполнение кода. Вы можете просто продолжить, если именно так структурирован ваш код.
Двойной щелчок маркера точки останова рядом с "All Exception" позволяет настроить, где и как остановится точка прерывания исключения:
![навигатор точки останова, показывающий параметры для того, как и когда возникает точка останова]()