Ответ 1
asm {trap} ; Halts a program running on PPC32 or PPC64.
__asm {int 3} ; Halts a program running on IA-32.
Какая инструкция может вызвать перерыв в Xcode? Например, в Visual Studio я мог бы делать "_asm int 3" или "DebugBreak()". В некоторых реализациях GCC это asm ( "break 0" ) или asm ( "trap" ).
Я пробовал различные комбо в Xcode без везения. (встроенный ассемблер отлично работает, поэтому он не является проблемой синтаксиса).
Для справки это для макроса assert. Я не хочу использовать определения в assert.h как для переносимости, так и потому, что они, как представляется, делают abort() в версии XCode.
Джон - Супер, приветствия. Для справки синтаксис int 3 необходим для Intel Mac и iPhone.
Chris - Спасибо за ваш комментарий, но есть много причин, чтобы избежать стандартной функции assert() для кодовых баз, портированных на разные платформы. Если вы столкнулись с проблемой отката своего собственного утверждения, это обычно потому, что у вас есть дополнительные функции (ведение журнала, разворачивание стека, взаимодействие с пользователем), которые вы хотите сохранить.
Ваше предложение о попытке заменить hander через реализацию "__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()
для "причинности переносимости" - переносимость - вот почему она существует! Это часть стандарта C, и вы найдете ее везде, где вы найдете компилятор C. То, что вы действительно хотите сделать, это определить новый обработчик assertion, который отлаживает отладчик вместо вызова abort()
; практически все компиляторы C предлагают механизм, с помощью которого вы можете это сделать.
Обычно это делается путем простого выполнения функции или макроса, следующего за этим прототипом:
void __assert(const char *expression, const char *file, int line);
Он вызывается, когда выражение утверждения терпит неудачу. Обычно это, а не assert()
, это то, что выполняет "printf()
, за которым следует abort()
", что является документированным поведением по умолчанию. Настраивая эту функцию или макрос, вы можете изменить его поведение.
Для потомков: у меня есть код для генерации остановок в правильном стеке стека в отладчике и (необязательно) приостановка приложения, чтобы вы могли своевременно подключить отладчик. Работает на симуляторе и устройстве (и, возможно, на рабочем столе, если вам когда-нибудь понадобится). Исчерпывающий подробный пост в http://iphone.m20.nl/wp/2010/10/xcode-iphone-debugger-halt-assertions/
Я нашел следующее в Apple Forum:
Xcode не содержит никаких символических перерывов, но они быстро добавить. Перейдите в окно точек останова и добавьте:
- [NSException raise]
kill(getpid(), SIGINT);
Работает в симуляторе и устройстве.
__builtin_trap();
Так как Debugger() теперь обесценивается, это должно работать вместо этого.
Существует также следующая функция, доступная как альтернативная альтернатива поперечной платформе Halt():
#include <stdlib.h>
void abort(void);
Мы используем его в нашем кросс-платформенном движке для реализации iPhone в случае фатальных утверждений. Перекрестная платформа через Nintendo DS/Wii/XBOX 360/iOS и т.д.