2012-05-08 15 views
22

¿Es posible obtener un número de línea para el código fuente (o cualquier cosa que ayude a depurar dónde está el problema) del depurador, que muestra de dónde se origina el problema?Objetivo C: ¿obtener el número de línea o el rastro de la pila completa del error del depurador?

estoy consiguiendo un error:

-[NSCFArray objectAtIndex:]: index (-1 (or possibly larger)) beyond bounds (9) 

lo que obviamente significa que me voy fuera de los límites en algún momento, sin embargo, si es posible me gustaría conseguir algo más de información para ayudar a resolver el problema.

Estoy colocando un punto de interrupción y tratando de pasar por el programa línea por línea, pero es un proceso tedioso. ¡Gracias!

Respuesta

81

Cuando el depurador se detiene, vaya al "Debug Navigator" y asegúrese de que el control deslizante en la parte inferior esté completamente hacia la derecha.

Escanee su vista desde el punto en el que se produce la excepción y, finalmente, debe llegar a su propio código. Haga clic en el nombre del método/función apropiado y el código se abrirá en el editor.

enter image description here

enter image description here

Si no ve ninguna de sus propios métodos en el seguimiento de la pila, la excepción puede haber sido pasado a través de una llamada al estilo performSelector en cuyo caso el seguimiento de la pila se ha ido . Si este es el caso, puede obtener una mejor información al agregar un punto de interrupción de excepción "Al lanzar". En primer interruptor a la "navegador punto de interrupción":

enter image description here

A continuación, haga clic en el signo más y seleccione "Añadir punto de interrupción de excepción ..."

enter image description here

Crear una "el tiro" punto de ruptura :

enter image description here

Esto detendrá el depurador en el punto exacto se lanza la excepción, y obtienes un mejor seguimiento de la pila. Es una buena idea tener un punto de interrupción de excepción como este habilitado todo el tiempo, aunque ocasionalmente obtendrá excepciones internas del código de Apple (por ejemplo, al usar QLPreviewController, MPMoviePlayerController).

+0

Sweet! Muchas gracias Mike! ¿Hay algo similar en Xcode 3.x? Uso Xcode 4.3 en casa, pero en el trabajo sigue siendo Xcode 3. Una vez más, gracias. – Kevin

+2

¿Por qué todavía usas Xcode 3? Esa es una muy mala idea. –

+0

¡Dile a mi jefe eso! Gracias por tu ayuda Mike. – Kevin

7

También debería considerar usar NSSetUncaughtExceptionHandler. (Puede guardar el registro de bloqueo para el disco, visite el siguiente inicio si un nuevo registro de bloqueo se salvó, adjuntarlo a un correo electrónico, etc.)

poner esto en su método de didFinishLaunchingWithOptions:

NSSetUncaughtExceptionHandler(&exceptionHandler); 

e implemente su manejador de excepciones:

void exceptionHandler(NSException *exception) 
{   
    NSLog(@"%@",[exception name]); 
    NSLog(@"%@",[exception reason]); 
    NSLog(@"%@",[exception userInfo]); 
    NSLog(@"%@",[exception callStackSymbols]); 
    NSLog(@"%@",[exception callStackReturnAddresses]); 
} 
Cuestiones relacionadas