Эквивалент Xcode для '__asm ​​int 3 / DebugBreak () / Halt? - PullRequest
21 голосов
/ 01 сентября 2008

Какова инструкция, чтобы вызвать хард-брейк в 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 ]

22 голосов
/ 01 сентября 2008

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.
10 голосов
/ 02 сентября 2008

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

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

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

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

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

5 голосов
/ 07 сентября 2012
__builtin_trap();

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

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

3 голосов
/ 27 апреля 2011

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

2 голосов
/ 01 июня 2011
kill(getpid(), SIGINT);

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

2 голосов
/ 01 сентября 2008

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

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

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

1 голос
/ 06 апреля 2009

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

#include <stdlib.h>

void abort(void);

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

...