2012-02-26 10 views
7

IIRC, esto normalmente funciona. Sin embargo, recientemente he notado que NSAssert…() no me está dando trazas de la pila, o al menos, los no útiles:Sin rastro de pila de NSAssert

2012-02-26 14:41:19.283 MyApp[3299:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '…' 
*** First throw call stack: 
(0x33cc58bf 0x353e11e5 0x33cc57b9 0x317583b3 0x78423 0x76e35 0x77dbf 0x217dd 0x12c63 0x3178a943 0x33c99a63 0x33c996c9 0x33c9829f 0x33c1b4dd 0x33c1b3a5 0x3585bfcd 0x34d60743 0xde87 0x30dc) 
terminate called throwing an exception(gdb) bt 
#0 0x3629232c in __pthread_kill() 
#1 0x34b3ef5a in pthread_kill() 
#2 0x34b37fea in abort() 
#3 0x35fe9f6a in abort_message() 
#4 0x35fe734c in default_terminate() 
#5 0x353e12e2 in _objc_terminate() 
#6 0x35fe73c4 in safe_handler_caller() 
#7 0x35fe7450 in std::terminate() 
#8 0x35fe8824 in __cxa_rethrow() 
#9 0x353e1234 in objc_exception_rethrow() 
#10 0x33c1b544 in CFRunLoopRunSpecific() 
#11 0x33c1b3a4 in CFRunLoopRunInMode() 
#12 0x3585bfcc in GSEventRunModal() 
#13 0x34d60742 in UIApplicationMain() 
#14 0x0000de86 in main (argc=1, argv=0x2fdffaa4) at …/main.mm:18 
(gdb) 

leí en alguna parte que el uso de un destino del despliegue de iOS que Xcode no tiene símbolos para las causas de esta , y cambié la configuración recientemente de 4.0 a 4.3. Sin embargo, cambiarlo nuevamente no hace diferencia.

OTOH, assert(…) funciona como se esperaba.

¿Por qué Xcode no proporciona una traza de pila navegable adecuada cuando NSAssert…() falla?

Respuesta

5

No estoy seguro de por qué es así, pero, si establece un punto de interrupción de excepción, el punto de interrupción parece detener la ejecución lo suficientemente temprano como para ver una traza inversa útil. Una vez que se llega al punto de interrupción, bt en la consola funciona como se esperaba.

enter image description here

Asegúrese de que no lo hace de verificación "continúa automáticamente después de evaluar" caja. Eso parece dar como resultado una traza inversa inútil como la que publicaste.

También puede usar NSSetUncaughtExceptionHandler() para establecer una función de devolución de llamada de registro como se describe here.

Cuestiones relacionadas