Взлом отладчика на iPhone

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

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

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


person Community    schedule 19.07.2009    source источник


Ответы (8)


изменить

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

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

Думаю принцип тот же.


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

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

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

person Community    schedule 13.11.2009
comment
Я могу подтвердить, что это отлично работает как на устройстве, так и на симуляторе. Большое спасибо! Хотел бы я отметить, что он принят... - person Bill; 20.04.2011

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

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

person Community    schedule 20.07.2009
comment
asm(trap) у меня не сработал, к вашему сведению. Он ведет себя так же, как assert из assert.h (вы не можете продолжать, когда он срабатывает). - person Dave; 14.05.2010

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

person rpetrich    schedule 19.07.2009
comment
Работает на меня. Я также хотел бы отметить, что код, указанный выше, будет давать неявные предупреждения компилятора объявлений. Добавьте объявление функции непосредственно над #ifdef DEBUG.. void _MyAssert(int val); Кроме того, для проекта iPhone я обнаружил, что реализация функции в main.c работает хорошо. - person ohhorob; 03.12.2009

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

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

person Jens Alfke    schedule 19.07.2009
comment
Ручная установка точки останова не подходит для утверждений, потому что эти утверждения повсюду. Я ищу способ вызвать перерыв по требованию из моего кода. - person ; 19.07.2009

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

assert(pointerToTest != nil);

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

assert(false);

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

person Brad Larson    schedule 19.07.2009
comment
Думаю проблема в том, что с этого метода нельзя возобновить выполнение в отладчике. - person Dave; 14.05.2010

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

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

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

person Ohad Kravchick    schedule 17.12.2010

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

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

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

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

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

[ exception raise ]

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

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

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

person Cerniuk    schedule 09.10.2016

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

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

person Dan Lorenc    schedule 19.07.2009