Вопрос

Какова инструкция, чтобы вызвать хард-брейк в 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, он не отображается на других платформах.

Это было полезно?

Решение

Другие советы

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

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

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

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

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

__builtin_trap();

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

https://developer.apple.com/library/mac/technotes/tn2124/_index.html#//apple_ref/doc/uid/DTS10003391-CH1-SECCONTROLLEDCRASH

Для потомков: у меня есть некоторый код для генерации остановок в правильном кадре стека в отладчике и (опционально) приостановки приложения, чтобы вы могли подключить отладчик точно в срок. Работает для симулятора и устройства (и, возможно, рабочего стола, если вам это когда-нибудь понадобится). Подробное подробное сообщение на 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 и т. Д.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top