Подтвердить что ты не робот

Вторжение в отладчик на iPhone

Для макросов assert в моем iPhone-проекте я ищу способ программного взлома в отладчик. В Windows (MSVС++) для этой цели я могу использовать __debugbreak(). Вызов этой функции остановит мою программу, запустит отладчик и отобразит столбец строки, который вызвал __debugbreak().

Есть ли что-то похожее на __debugbreak() для iPhone? Я пробовал Debugger(), но это дает мне ошибку компоновщика.

Спасибо, Клаус

4b9b3361

Ответ 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", затем введите имя.

Ответ 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" позволяет настроить, где и как остановится точка прерывания исключения:

навигатор точки останова, показывающий параметры для того, как и когда возникает точка останова