Equivalente a Xcode de ''__asm int 3/DebugBreak()/Halt?
osx (7)
¿Cuál es la instrucción de causar un quiebre en Xcode? Por ejemplo, en Visual Studio podría hacer ''_asm int 3'' o ''DebugBreak ()''. En algunas implementaciones de GCC, es asm ("break 0") o asm ("trap").
He intentado varios combos bajo Xcode sin suerte. (el ensamblador en línea funciona bien, así que no es un problema de sintaxis).
Como referencia, esto es para una macro assert. No quiero utilizar las definiciones en assert.h para la portabilidad, y porque parecen hacer un abort () en la versión que proporciona XCode.
John - Súper, aplausos. Como referencia, la sintaxis int 3 es la requerida para Intel Macs y iPhone.
Chris - Gracias por tu comentario, pero hay muchas razones para evitar la función estándar assert () para las bases de código portado a diferentes plataformas. Si se tomó la molestia de lanzar su propia afirmación, generalmente se debe a que tiene una funcionalidad adicional (registro, desenrollado de la pila, interacción del usuario) que desea conservar.
Su sugerencia de intentar reemplazar el hander a través de una implementación de ''__assert'' o similar no va a ser portable. El ''assert'' estándar es generalmente un macro y mientras que puede asignarse a __assert en Mac no lo hace en otras plataformas .
Encontré lo siguiente en un foro de Apple :
Xcode no incluye ningún tipo de interrupción simbólica, pero son rápidos de agregar. Vaya a la ventana de puntos de interrupción y agregue:
- [NSException raise]
Simplemente puede insertar una llamada a Debugger()
: eso detendrá su aplicación en el depurador (si se está ejecutando bajo el depurador), o la detendrá con una excepción si no lo hace.
Además, no evite assert()
por "razones de portabilidad" : la portabilidad es la razón por la que existe. Es parte de Standard C, y lo encontrará donde encuentre un compilador de C. Lo que realmente quiere hacer es definir un nuevo manejador de aserción que realice un corte de depurador en lugar de llamar a abort()
; virtualmente todos los compiladores de C ofrecen un mecanismo por el cual puedes hacer esto.
Normalmente esto se hace simplemente implementando una función o macro que sigue a este prototipo:
void __assert(const char *expression, const char *file, int line);
Se invoca cuando falla una expresión de aserción. Usualmente, no assert()
, es lo que realiza " printf()
seguido de abort()
" que es el comportamiento documentado por defecto. Al personalizar esta función o macro, puede cambiar su comportamiento.
asm {trap} ; Halts a program running on PPC32 or PPC64.
__asm {int 3} ; Halts a program running on IA-32.
Para la posteridad: tengo un código para generar bloqueos en el marco de pila correcto en el depurador y (opcionalmente) pausar la aplicación para que pueda adjuntar el depurador justo a tiempo. Funciona para simulador y dispositivo (y posiblemente para computadora de escritorio, si alguna vez lo necesita). Exhaustively detailed post en http://iphone.m20.nl/wp/2010/10/xcode-iphone-debugger-halt-assertions/
kill(getpid(), SIGINT);
Funciona en el simulador y el dispositivo.
También está disponible la siguiente función que está disponible como alternativa de plataforma cruzada Halt ():
#include <stdlib.h>
void abort(void);
Lo usamos en nuestro motor multiplataforma para la implementación de iPhone en caso de afirmaciones fatales. Plataforma cruzada en Nintendo DS / Wii / XBOX 360 / iOS, etc.
__builtin_trap();
Dado que Debugger () se deprecia ahora, esto debería funcionar.