2009-07-19 17 views
16

Para macros assert en mi proyecto de iPhone, estoy buscando una manera de entrar programáticamente en el depurador. En Windows (MSVC++), puedo usar __debugbreak() para este propósito. Invocar esta función detendrá mi programa, iniciará el depurador y mostrará una pila de llamada de la línea que llamó __debugbreak().Entrando en el depurador en el iPhone

¿Hay algo similar a __debugbreak() para el iPhone? Probé Debugger(), pero eso me da un error de enlazador.

Gracias, Noel

Respuesta

0

que acaba de establecer un punto de interrupción en el lugar quiero parar. Xcode recuerda los puntos de interrupción persistentemente, así que cada vez que ejecuto la aplicación con gdb, se detendrá en ese punto.

Si desea romper las fallas de aserción, un buen lugar para establecer un punto de interrupción es sobre la función objc_exception_throw, en el tiempo de ejecución de Objective-C, que es lo que realmente arroja una excepción. Use la ventana Ejecutar> Mostrar> Puntos de interrupción y haga doble clic en la fila "Hacer doble clic en el símbolo", luego escriba el nombre.

+0

Configuración manual de un punto de interrupción no es una opción para asevera porque aquellos afirma están por todo el lugar. Estoy buscando una manera de activar un corte en la demanda desde mi código. –

1

primero Añadir -DDEBUG-OTHER_CFLAGS en su destino de depuración; esto definirá el símbolo DEBUG al construir una construcción de depuración.

A continuación, añadir una macro simple aserción a la cabecera de prefijo:

#ifdef DEBUG 
#define MyAssert(val) _MyAssert(val) 
#else 
#define MyAssert(val) do { } while(0) 
#endif 

A continuación, cree una función en un módulo _MyAssert alguna parte:

#ifdef DEBUG 
void _MyAssert(int expression) 
{ 
    if (expression == 0) { 
     NSLog(@"Assertion failed!"); // Place breakpoint here 
    } 
} 
#endif 

Finalmente crear un punto de interrupción en la línea NSLog.

+0

Funciona para mí. También me gustaría señalar que el código enumerado anteriormente dará advertencias del compilador de "declaración implícita". Agregue la declaración de la función inmediatamente arriba de #ifdef DEBUG .. void _MyAssert (int val); Además, para un proyecto de iPhone encontré que poner la implementación de la función en main.c funciona muy bien. – ohhorob

0

¿Hay algún problema con la macro simple assert()? Algo como

assert(pointerToTest != nil); 

detendrá su proceso en ese punto si la condición no es verdadera. Si se ejecuta bajo el depurador, se le presentará un seguimiento de la pila de llamadas que llevaron a la aserción fallida. Si desea activar cada vez que se pulsa una determinada ruta de código, se puede hacer

assert(false); 

Encuentro estas afirmaciones extremadamente útil para verificar que todos los IBOutlets no son nulas cuando una ventana o vista se sacaron de una PUNTA.

+0

Creo que el problema es que no puede reanudar la ejecución en el depurador desde este método. – Dave

6

Una persona útil en el foro de desarrolladores de Apple me dio la sugerencia de usar asm("trap") cuando se ejecuta en el dispositivo y asm("int3") cuando se ejecuta en el simulador. Esto hace que el programa entre en el depurador si inició su programa en modo de depuración (Option-Command-Y).

(__builtin_trap() rompe también en el depurador, pero no se puede continuar después. assert(false) termina el programa con un mensaje, pero no se rompe en el depurador.)

+1

asm ("trampa") no funcionó para mí, FYI. Se comporta de la misma manera que assert from assert.h (no puede continuar cuando se desencadena). – Dave

26

edición

Resulta que esto también funciona:

#define Debugger() { raise(SIGINT) ; }

Creo que es el mismo principio.


utilizo este:

#define Debugger() { kill(getpid(), SIGINT) ; }

creo que funciona en el simulador y en el dispositivo .. no requiere montaje!

+0

Además, puede continuar desde este ... – nielsbot

+1

Puedo confirmar que esto funciona perfectamente tanto en el dispositivo como en el simulador. ¡Muchas gracias! Ojalá pudiera marcarlo aceptado ... – Bill

0

Si ejecuta el programa en depuración, su aplicación debería iniciar el depurador cuando alcanza una aserción no válida.

Para que pare, como Jens Alfke intentó decir, debe habilitar "Detener en excepciones de Objective-C" (en el menú Ejecutar).

Para obtener más información acerca de la depuración frente a la liberación y afirma, leer http://myok12.wordpress.com/2010/10/10/to-use-or-not-to-use-assertions/

0

Véase mi respuesta https://stackoverflow.com/a/3912667/473067

Se le indica cómo interrumpir el depurador, con parada en la línea correcta del marco de pila correcto, usando algunas macros de ensamblador en línea.

0

Mientras que un hilo antiguo, encontró este mismo tema mientras que la investigación de Xcode 7. ¿Qué resuelve esto para mí era una característica llamada "Crear punto de interrupción de excepción ..."

Depurar> Puntos de corte> Crear punto de interrupción de excepción. ..

Esto pone un punto de interrupción especial en el Breakpoint Navigator (en Vista> Navegadores> Mostrar navegador de punto de interrupción).

breakpoint navigator pane showing All Exceptions breakpoint

Esto rompe en el tiro real de la excepción:

[ exception raise ] 

sin necesidad de terminar su ejecución de código. Puedes continuar si así es como está estructurado tu código.

doble clic en el marcador de punto de ruptura al lado de "Todo Excepción" le permite ajustar dónde y cómo el punto de ruptura excepción detiene:

break point navigator showing options on for how and when breakpoint occurs