Pregunta

¿Cuál es la instrucción para provocar una ruptura 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").

Probé varios combos en Xcode sin suerte.(El ensamblador en línea funciona bien, por lo que no es un problema de sintaxis).

Como referencia, esto es para una macro de afirmación.No quiero usar las definiciones en afirmar.h tanto por portabilidad como porque parecen realizar un aborto () en la versión que proporciona XCode.


John - Genial, saludos.Como referencia, la sintaxis int 3 es la requerida para Intel Mac y iPhone.


Chris: Gracias por tu comentario, pero hay muchas razones para evitar la función de afirmación estándar () para bases de código trasladadas a diferentes plataformas.Si se ha tomado la molestia de crear su propia afirmación, generalmente es porque tiene funciones adicionales (registro, desenredado de pila, interacción con el usuario) que desea conservar.

Su sugerencia de intentar reemplazar el controlador mediante una implementación de '__assert" o similar no será portátil.El 'assert' estándar suele ser una macro y, si bien puede asignarse a __assert en Mac, no lo hace en otras plataformas.

¿Fue útil?

Solución

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.

Otros consejos

Puedes simplemente 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 es así.

También, no evitar assert() por "razones de portabilidad" — ¡La portabilidad es la razón por la que existe!Es parte del Estándar C y lo encontrará dondequiera que encuentre un compilador de C.Lo que realmente quieres hacer es definir un nuevo controlador de aserciones eso hace que el depurador se rompa en lugar de llamar abort();Prácticamente todos los compiladores de C ofrecen un mecanismo mediante el cual se puede hacer esto.

Normalmente, esto se hace simplemente implementando una función o macro que sigue este prototipo:

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

Se llama cuando falla una expresión de aserción.Por lo general, no assert() en sí, es lo que realiza "el printf() seguido por abort()"Ese es el comportamiento documentado predeterminado.Al personalizar esta función o macro, puede cambiar su comportamiento.

__builtin_trap();

Dado que Debugger() está depreciado ahora, esto debería funcionar.

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

Para la posteridad:Tengo un código para generar detenciones 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 escritorio, si alguna vez lo necesita).Publicación exhaustivamente detallada en http://iphone.m20.nl/wp/2010/10/xcode-iphone-debugger-halt-assertions/

Encontré lo siguiente en un Foro de Apple:

Xcode no viene con descansos simbólicos integrados, pero son rápidos de agregar.Vaya a la ventana de puntos de interrupción y agregue:

-[Aumento de NSException]

kill(getpid(), SIGINT);

Funciona en el simulador y el dispositivo.

También existe la siguiente función que está disponible como alternativa a Halt() directa multiplataforma:

#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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top