Эквивалент 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 ответов
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/
Я нашел следующее на Apple Forum:
Xcode не имеет встроенных символических разрывов - но они быстро добавляются. Перейдите в окно точек останова и добавьте:
- [Повышение NSException]
Существует также следующая функция, которая доступна как кроссплатформенная прямая альтернатива Halt():
#include <stdlib.h>
void abort(void);
Мы используем его в нашем кроссплатформенном движке для реализации iPhone в случае фатальных утверждений. Кроссплатформенность через Nintendo DS/Wii/XBOX 360/iOS и т. Д.