2008-09-01 23 views
17

¿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").Xcode equivalente a '__asm ​​int 3/DebugBreak()/Halt?

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 usar las definiciones en assert.h para la portabilidad, y porque parecen hacer un abort() en la versión que proporciona XCode.


John - Super, cheers. Como referencia, la sintaxis int 3 es la requerida para Intel Macs y iPhone.


Chris - Gracias por su comentario, pero hay muchas razones para evitar la función assert() estándar para 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 la Mac no lo hace ' . t en otras plataformas

Respuesta

18

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. 
+6

Con la sintaxis ASM GCC/ruido metálico, esto se convierte en '__asm ​​__ ("int $ 3")' para Macs Intel y (probablemente) '__ __asm ​​("trampa")' para iDevices. – zneak

+1

El enlace de arriba parece estar muerto ahora. – rstackhouse

2

he encontrado lo siguiente en un Apple Forum:.

Xcode no viene con ningún salto simbólicos construidos en - pero son rápido agregar Ir a la ventana de puntos de ruptura y agregar:

- [N aumento SException]

10

Puede basta con insertar una llamada a Debugger() - que detendrá su aplicación en el depurador (si se está ejecutando en el depurador), o detener con una excepción si no es así

Además, no evitan assert() por "razones de portabilidad" - portabilidad es por eso que existe! Es parte de Standard C, y lo encontrará donde encuentre un compilador de C. Lo que realmente desea hacer es definir un nuevo manejador de aserción que haga un corte de depuración en lugar de llamar al 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 este prototipo:

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

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

+2

¿Qué es una forma portátil de caer en el depurador en la línea fallida? assert() te deja caer en el código de la biblioteca ... – JBRWilkinson

+1

Gracias Chris, pero primero - Debugger() está marcado como "obsoleto" en los encabezados, sin dirección para un reemplazo, Segundo - No sé con qué vincular, en para tenerlo - los marcos normales "Cocoa" y "CoreFoundation" no lo tienen - Tengo un error de enlace para un símbolo que falta en _Debugger –

1

También existe la siguiente función que está disponible como plataforma cruzada Halt recta() alternativa:

#include <stdlib.h> 

void abort(void); 

Lo utilizamos en nuestro motor multiplataforma para la aplicación iPhone en caso de afirma fatal. Plataforma cruzada en Nintendo DS/Wii/XBOX 360/iOS, etc.

3

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). Exhaustivamente detallado puesto en http://iphone.m20.nl/wp/2010/10/xcode-iphone-debugger-halt-assertions/

2
kill(getpid(), SIGINT); 

Obras en el simulador y el dispositivo.

+0

Primero que nada, = 'raise (SIGINT)'. En segundo lugar, estos tienen una tendencia molesta a ser reenviados al hilo principal, por lo que si lo haces en otro hilo, en realidad no detienes donde lo levantaste. – Ilya