2009-07-07 10 views
50

Disculpe mi ignorancia, pero algo me ha estado molestando sobre el depurador de Xcode al ejecutar aplicaciones de iPhone en el simulador de iPhone.Seguimiento de pila o más información sobre excepción no controlada en Xcode/iPhone

A veces, cuando estropeo algo en Interface Builder, recibo una excepción no controlada en el tiempo de ejecución y me vuelven a enviar a Xcode. Lo único que veo es una sola línea "excepción no detectada" o algo así. Por lo que puedo ver, no hay información adicional, mucho menos un rastro de pila o cualquier otra cosa que sea útil.

He estado desarrollando en Visual Studio durante la última década más o menos, y estoy acostumbrado a obtener un buen seguimiento de pila y completar la información de excepción cuando sucede algo así.

Estoy seguro de que simplemente estoy perdiendo algo muy obvio ... Con suerte ...

Respuesta

70

Si agrega dos puntos de ruptura, que debe ser capaz de depurar estas excepciones. Para hacer esto, vaya a Ejecutar | Mostrar | Puntos de interrupción y crear dos puntos de corte globales (los hago globalmente porque son muy útiles en todas mis aplicaciones). El primero debe llamarse "objc_exception_throw" y su ubicación debe ser "libobjc.A.dylib". El segundo debe ser "- [Subida NSException]" y su ubicación debe ser "CoreFoundation".

Ahora, si comienza a depurar su aplicación con los puntos de interrupción habilitados, debería interrumpirse en el lanzamiento de estas excepciones. Entonces debería poder ver la cadena de eventos que condujo a la excepción dentro del depurador.

+1

Para el desarrollo de iPhone solo necesita la primera. Esta es la mejor manera de obtener detalles sobre dónde ocurren las excepciones. –

+0

Sí, creo que el segundo solo se aplica a las versiones de Mac OS anteriores a Leopard. Sin embargo, no hace daño mantenerlo. –

+1

@Kendall Helmstetter Gelner @Philippe Leybaert ¿Sigue siendo válida esta respuesta en xCode 4? No puedo encontrar libobjc.A.dylib. Quiero decir, tampoco está claro para mí cómo aplicar un punto de interrupción a un archivo (¿y no a una línea de código?) – aneuryzm

1

Usted puede envolver su UIApplicationMain en un try/catch:

int main(int argc, char *argv[]) { 
    int retVal; 
    NSAutoreleasePool * pool; 
    @try 
    { 
    pool = [[NSAutoreleasePool alloc] init]; 
    retVal = UIApplicationMain(argc, argv, nil, nil); 
    } 
    @catch(NSException* e) 
    { 
     NSLog(@"%@", e.reason); 
    } 
    @finally 
    { 
    [pool release]; 
    } 
    return retVal; 
} 

También debe mirar hacia arriba para configurar un manejador de aserción durante la depuración: NSAssertionHandler.

Actualización: y también el manejador de excepción no controlada: NSSetUncaughtExceptionHandler

2

Oye activa: para obtener más información acerca de las excepciones de tiempo de ejecución, debería poder abrir la consola del depurador y ver más información. Supongo que ya lo hizo, pero por las dudas, puede acceder seleccionando Ejecutar -> Consola en el menú. ¡No estoy seguro de por qué no aparece automáticamente!

+0

No lo he hecho, gracias por el aviso. Todavía estoy aprendiendo Xcode (es todo un salto cuando prácticamente vives en Visual Studio todos los días de tu vida) –

+0

Sí, es un cambio bastante grande. Utilicé Eclipse por siglos, ¡y la interfaz se ve totalmente desnuda en comparación! ¡Solo como 5 botones! Sin embargo, tiene muchas características ocultas. Eclipse parece tan grande y torpe para mí ahora ... –

3

La falta de un seguimiento de pila es generalmente indicativo de un problema con LLDB (depurador). Me encanta LLDB, pero cuando se trata de mostrar rastros de pila y romper la excepción en lugar de la principal en las aplicaciones de iOS, es un dolor en el culo y ha sido para algunas versiones ahora. No tengo idea de por qué Apple no ha abordado esto todavía. Para solucionarlo, se trata de un proceso de dos pasos:

  1. Edite su esquema actual y en la pestaña "Ejecutar" cambie el depurador de LLDB a GDB.
  2. Vaya a https://developer.apple.com/bugreporter/ e informe el error para que Apple lo aborde.
Cuestiones relacionadas