2012-05-26 33 views
13

Después de usar un NSAssert() que emite una excepción NSInternalInconsistencyException en una aplicación de Objective-C se ejecuta en un dispositivo iPad (compilado en modo de depuración), consigo algo similar a:Objective-C Seguimiento de la pila

2012-05-27 02:31:36.830 appname[10821:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'reason' 
*** First throw call stack: 
(0x3800788f 0x33338259 0x38007789 0x371f13a3 0x791a1 0x79555 0x79e03 0x7a44d 0x798d3 0x737fd 0x30e19c8b 0x30e18461 0x30e0ae87 0x30e7b7d5 0x30e18e6d 0x30e127dd 0x30de0ac3 0x30de0567 0x30ddff3b 0x3644122b 0x37fdb523 0x37fdb4c5 0x37fda313 0x37f5d4a5 0x37f5d36d 0x30e1186b 0x30e0ecd5 0x7343f 0x733e4) 
terminate called throwing an exception 

¿Cómo puede Encuentro útil stack trace, que me proporciona al menos una lista simple de todas las funciones que se llamaron hasta que se lanzó la excepción.

Xcode tampoco ayuda:

http://i47.tinypic.com/xax4l0.png

bt en lldb espectáculos:

(lldb) bt 
* thread #1: tid = 0x1c03, 0x30c6832c libsystem_kernel.dylib`__pthread_kill + 8, stop reason = signal SIGABRT 
    frame #0: 0x30c6832c libsystem_kernel.dylib`__pthread_kill + 8 
    frame #1: 0x331f920e libsystem_c.dylib`pthread_kill + 54 
    frame #2: 0x331f229e libsystem_c.dylib`abort + 94 
    frame #3: 0x37682f6a libc++abi.dylib`abort_message + 46 
    frame #4: 0x3768034c libc++abi.dylib`_ZL17default_terminatev + 24 
    frame #5: 0x33338356 libobjc.A.dylib`_objc_terminate + 146 
    frame #6: 0x376803c4 libc++abi.dylib`_ZL19safe_handler_callerPFvvE + 76 
    frame #7: 0x37680450 libc++abi.dylib`std::terminate() + 20 
    frame #8: 0x37681824 libc++abi.dylib`__cxa_rethrow + 88 
    frame #9: 0x333382a8 libobjc.A.dylib`objc_exception_rethrow + 12 
    frame #10: 0x37f5d50c CoreFoundation`CFRunLoopRunSpecific + 404 
    frame #11: 0x37f5d36c CoreFoundation`CFRunLoopRunInMode + 104 
    frame #12: 0x30e1186a UIKit`-[UIApplication _run] + 550 
    frame #13: 0x30e0ecd4 UIKit`UIApplicationMain + 1080 
    frame #14: 0x0007343e appname`main + 86 at main.m:5 

Esto es mejor, pero todavía no es muy útil. Todavía no sé qué condujo a la excepción lanzada.

+0

¿Qué le proporciona el tipeo 'bt' en la ventana de depuración? – lnafziger

+0

@lnafziger, pregunta actualizada. – rid

Respuesta

40

Un par de cosas útiles:

  1. Si está ejecutando la aplicación de Xcode, añadir un punto de interrupción de excepción. En el navegador de punto de interrupción (comando-6), presione el '+' en la parte inferior izquierda para agregar. Esto hará una pausa en la ejecución en la línea que lanza la excepción y permitirá inspeccionar el ámbito actual, apilar, etc.

  2. Si está usando GDB, utilice bt para imprimir la traza

  3. Si' re usando lldb, use thread backtrace en su lugar

+2

¡Agradable! El punto de interrupción de excepción es exactamente lo que estaba buscando, gracias. – rid

+0

no hay problema. y sí, el día que aprendí acerca de los puntos de interrupción de excepciones cambió mi vida. He encontrado que es una de las herramientas de depuración más útiles. – Sean

+4

Lamento tener solo 1 votaciones para dar. – Jeff

Cuestiones relacionadas