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

Xcode эквивалент '__asm ​​int 3/DebugBreak()/Halt?

Какая инструкция может вызвать перерыв в Xcode? Например, в Visual Studio я мог бы делать "_asm int 3" или "DebugBreak()". В некоторых реализациях GCC это asm ( "break 0" ) или asm ( "trap" ).

Я пробовал различные комбо в Xcode без везения. (встроенный ассемблер отлично работает, поэтому он не является проблемой синтаксиса).

Для справки это для макроса assert. Я не хочу использовать определения в assert.h как для переносимости, так и потому, что они, как представляется, делают abort() в версии XCode.


Джон - Супер, приветствия. Для справки синтаксис int 3 необходим для Intel Mac и iPhone.


Chris - Спасибо за ваш комментарий, но есть много причин, чтобы избежать стандартной функции assert() для кодовых баз, портированных на разные платформы. Если вы столкнулись с проблемой отката своего собственного утверждения, это обычно потому, что у вас есть дополнительные функции (ведение журнала, разворачивание стека, взаимодействие с пользователем), которые вы хотите сохранить.

Ваше предложение о попытке заменить hander через реализацию "__assert" или подобное не будет переносимым. Стандартный "assert" обычно является макросом, и хотя он может отображаться на __assert на Mac, он не на других платформах.

4b9b3361

Ответ 2

Вы можете просто вставить вызов в Debugger() - это остановит ваше приложение в отладчике (если оно выполняется под отладчиком) или остановит его с исключением, если это не так.

Кроме того, не избегать assert() для "причинности переносимости" - переносимость - вот почему она существует! Это часть стандарта C, и вы найдете ее везде, где вы найдете компилятор C. То, что вы действительно хотите сделать, это определить новый обработчик assertion, который отлаживает отладчик вместо вызова abort(); практически все компиляторы C предлагают механизм, с помощью которого вы можете это сделать.

Обычно это делается путем простого выполнения функции или макроса, следующего за этим прототипом:

void __assert(const char *expression, const char *file, int line);

Он вызывается, когда выражение утверждения терпит неудачу. Обычно это, а не assert(), это то, что выполняет "printf(), за которым следует abort()", что является документированным поведением по умолчанию. Настраивая эту функцию или макрос, вы можете изменить его поведение.

Ответ 3

Для потомков: у меня есть код для генерации остановок в правильном стеке стека в отладчике и (необязательно) приостановка приложения, чтобы вы могли своевременно подключить отладчик. Работает на симуляторе и устройстве (и, возможно, на рабочем столе, если вам когда-нибудь понадобится). Исчерпывающий подробный пост в http://iphone.m20.nl/wp/2010/10/xcode-iphone-debugger-halt-assertions/

Ответ 4

Я нашел следующее в Apple Forum:

Xcode не содержит никаких символических перерывов, но они быстро добавить. Перейдите в окно точек останова и добавьте:

- [NSException raise]

Ответ 5

kill(getpid(), SIGINT);

Работает в симуляторе и устройстве.

Ответ 7

Существует также следующая функция, доступная как альтернативная альтернатива поперечной платформе Halt():

#include <stdlib.h>

void abort(void);

Мы используем его в нашем кросс-платформенном движке для реализации iPhone в случае фатальных утверждений. Перекрестная платформа через Nintendo DS/Wii/XBOX 360/iOS и т.д.