Эквивалент Xcode для '__asm int 3 / DebugBreak () / Halt?
-
09-06-2019 - |
Вопрос
Какова инструкция, чтобы вызвать хард-брейк в 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, он не отображается на других платформах.
Решение
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 ()
; практически все компиляторы C предлагают механизм, с помощью которого вы можете сделать это.
Обычно это делается путем простой реализации функции или макроса, который следует этому прототипу:
void __assert(const char *expression, const char *file, int line);
Вызывается, когда выражение утверждения не выполняется. Обычно это, а не assert ()
, является тем, что выполняет " code> printf () , за которым следует abort ()
" это задокументированное поведение по умолчанию. Настраивая эту функцию или макрос, вы можете изменить его поведение.
__builtin_trap();
Поскольку Debugger () устарел, теперь это должно работать вместо этого.
Для потомков: у меня есть некоторый код для генерации остановок в правильном кадре стека в отладчике и (опционально) приостановки приложения, чтобы вы могли подключить отладчик точно в срок. Работает для симулятора и устройства (и, возможно, рабочего стола, если вам это когда-нибудь понадобится). Подробное подробное сообщение на http: //iphone.m20. п / шр / 2010/10 / Xcode-iphone-отладчик-HALT-утверждения /
Я нашел следующее на Apple Forum :
Xcode не имеет встроенных символических разрывов - но они быстро добавить. Перейдите в окно точек останова и добавьте:
- [Повышение NSException]
kill(getpid(), SIGINT);
Работает в симуляторе и устройстве.
Существует также следующая функция, которая доступна как кроссплатформенная прямая альтернатива Halt ():
#include <stdlib.h>
void abort(void);
Мы используем его в нашем кроссплатформенном движке для реализации iPhone в случае фатальных утверждений. Кроссплатформенность через Nintendo DS / Wii / XBOX 360 / iOS и т. Д.