guidelines - Apila el seguimiento o más información sobre la excepción no controlada en Xcode/iPhone
search ios (4)
Disculpe mi ignorancia, pero algo me ha estado molestando sobre el depurador de Xcode al ejecutar aplicaciones de iPhone en el simulador de iPhone.
A veces, cuando estropeo algo en Interface Builder, recibo una excepción no controlada en 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, y estoy acostumbrado a obtener un buen seguimiento de la pila y a completar la información de excepción cuando algo así sucede.
Estoy seguro de que me estoy perdiendo algo muy obvio ... Con suerte ...
Hola, activa: para obtener más información sobre 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!
La falta de un seguimiento de pila generalmente indica 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. Solucionarlo es un proceso de dos pasos:
- Edite su esquema actual y en la pestaña "Ejecutar" cambie el depurador de LLDB a GDB.
- Vaya a https://developer.apple.com/bugreporter/ e informe el error para que Apple lo aborde.
Puede envolver su UIApplicationMain en 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 consultar la configuración de un manejador de aserción durante la depuración: NSAssertionHandler .
Actualización: y también el controlador de excepción no controlada: NSSetUncaughtExceptionHandler
Si agrega dos puntos de interrupción, debería poder 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 romperse en el lanzamiento de estas excepciones. Entonces debería poder ver la cadena de eventos que condujo a la excepción dentro del depurador.