Взлом на отладчик на iPhone - PullRequest
16 голосов
/ 19 июля 2009

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

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

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

Ответы [ 8 ]

26 голосов
/ 13 ноября 2009

редактировать

Оказывается, это также работает:

#define Debugger() { raise( SIGINT ) ; }

Я думаю, что это тот же принцип.


Я использую это:

#define Debugger() { kill( getpid(), SIGINT ) ; }

Я думаю, что это работает в симуляторе и на устройстве .. сборка не требуется!

6 голосов
/ 20 июля 2009

Полезный человек на форуме разработчиков Apple дал мне совет использовать asm("trap") при работе на устройстве и asm("int3") при работе на симуляторе. Это приводит к тому, что программа запускается в отладчике, если вы запустили программу в режиме отладки (Option-Command-Y).

(__builtin_trap() также врывается в отладчик, но впоследствии вы не можете продолжить. assert(false) завершает программу сообщением, но не врывается в отладчик.)

1 голос
/ 19 июля 2009

Сначала добавьте -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.

0 голосов
/ 09 октября 2016

В то время как древняя нить нашла это во время исследования той же темы для Xcode 7. Что решило это для меня, это функция под названием «Создать исключительную точку останова ...»

Отладка> Точки останова> Создать точку останова исключения ...

Это помещает специальную точку останова в Навигатор точек останова (в меню «Просмотр»> «Навигаторы»> «Показать навигатор точек останова»).

breakpoint navigator pane showing All Exceptions breakpoint

Это прерывает фактический бросок исключения:

[ exception raise ]

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

Двойной щелчок на маркере точки останова рядом с «Все исключения» позволяет настроить, где и как останавливается точка останова исключения:

break point navigator showing options on for how and when breakpoint occurs

0 голосов
/ 17 декабря 2010

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

Чтобы остановить его, как пытался сказать Йенс Альфке, необходимо включить «Остановка при исключениях Objective C» (в меню «Выполнить»).

Для получения дополнительной информации об отладке и выпуске и утверждениях читайте http://myok12.wordpress.com/2010/10/10/to-use-or-not-to-use-assertions/

0 голосов
/ 19 июля 2009

Что-то не так с простым макросом assert ()? Что-то вроде

assert(pointerToTest != nil);

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

assert(false);

Я считаю эти утверждения чрезвычайно полезными для проверки того, что все IBOutlets не равны нулю, когда окно или представление выводятся из NIB.

0 голосов
/ 19 июля 2009

Проверить условные контрольные точки:

http://www.cocoabuilder.com/archive/message/xcode/2008/10/22/25358

0 голосов
/ 19 июля 2009

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

Если вы хотите разбить при сбое утверждения, хорошее место для установки точки останова - функция objc_exception_throw во время выполнения Objective C, которая фактически генерирует исключение. Используйте окно «Выполнить»> «Показать»> «Точки останова» и дважды щелкните строку «Двойной щелчок по символу», затем введите имя.

...