Эквивалент 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.


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

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

7 ответов

Решение

http://developer.apple.com/documentation/DeveloperTools/Conceptual/XcodeProjectManagement/090_Running_Programs/chapter_11_section_3.html

asm {trap}            ; Halts a program running on PPC32 or PPC64.

__asm {int 3}         ; Halts a program running on IA-32.

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

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

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

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

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

__builtin_trap();

Поскольку Debugger() устарел, теперь это должно работать вместо этого.

https://developer.apple.com/library/mac/technotes/tn2124/_index.html

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

kill(getpid(), SIGINT);

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

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

Xcode не имеет встроенных символических разрывов - но они быстро добавляются. Перейдите в окно точек останова и добавьте:

- [Повышение NSException]

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

#include <stdlib.h>

void abort(void);

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

Другие вопросы по тегам