2011-07-28 25 views
10

Recientemente me actualicé a Xcode 4 y aún no he descubierto cómo tener excepciones y mensajes de error registrados en la consola de ejecución.Xcode 4: Excepciones que no se registraron en la consola

Ejemplo: En Xcode 3, [[NSArray array] objectAtIndex:1] resultados en la siguiente se registra en la consola.

2011-08-10 10:27:22.061 App[28662:40b] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSArray objectAtIndex:]: index 1 beyond bounds for empty array' 
    *** Call stack at first throw: 
(
    0 CoreFoundation      0x015babe9 __exceptionPreprocess + 185 
    1 libobjc.A.dylib      0x0170f5c2 objc_exception_throw + 47 
    2 CoreFoundation      0x015b080c -[__NSArrayI objectAtIndex:] + 236 
    3 App         0x00002514 -[AppDelegate application:didFinishLaunchingWithOptions:] + 357 
    4 UIKit        0x003fc1fa -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1163 
    5 UIKit        0x003fe55e -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 439 
    6 UIKit        0x00408db2 -[UIApplication handleEvent:withNewEvent:] + 1533 
    7 UIKit        0x00401202 -[UIApplication sendEvent:] + 71 
    8 UIKit        0x00406732 _UIApplicationHandleEvent + 7576 
    9 GraphicsServices     0x01c24a36 PurpleEventCallback + 1550 
    10 CoreFoundation      0x0159c064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52 
    11 CoreFoundation      0x014fc6f7 __CFRunLoopDoSource1 + 215 
    12 CoreFoundation      0x014f9983 __CFRunLoopRun + 979 
    13 CoreFoundation      0x014f9240 CFRunLoopRunSpecific + 208 
    14 CoreFoundation      0x014f9161 CFRunLoopRunInMode + 97 
    15 UIKit        0x003fdfa8 -[UIApplication _run] + 636 
    16 UIKit        0x0040a42e UIApplicationMain + 1160 
    17 App         0x00002393 main + 85 

Esta excepción no registra nada a la consola en Xcode 4.

soy capaz de ver la pila de llamadas mediante la adición de un punto de interrupción de excepción - sin embargo, continuar más allá del punto de interrupción de excepción no registra cualquier cosa a la consola (ni siquiera un vago mensaje SIGABRT o EXC_BAD_ACCESS).

Tengo "Log Exceptions" y "Enable Zombie Objects" activados en la pestaña de Diagnóstico de la ventana Edit Scheme, pero no me ha ayudado. ¿Hay alguna otra configuración que podría estar perdiendo?

Muchas gracias.

+0

Quizás algo aquí ayude. Lo siento, no tengo nada más específico para ofrecer. http://developer.apple.com/library/mac/#documentation/IDEs/Conceptual/Xcode4TransitionGuide/Debugging/Debugging.html – dcpomero

+0

lo que es extraño es que estoy usando xcode 4 en MAC Lion y solo estoy rastreando la excepción en el ¡La misma manera de xcode3! que Xcode4 tienes ?! y que sistema operativo ?! –

+0

Xcode 4.2 ejecutándose en Snow Leopard. Estoy seguro de que simplemente tengo algo mal configurado. –

Respuesta

0

Por favor considere para mejorar su archivo gdbinit con lo siguiente:

How do I set these break points in ~/.gdbinit?

fb -[NSException raise] 
fb -[NSAssertionHandler handleFailureInFunction:file:lineNumber:description:] 
fb -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] 

#define NSZombies 
# this will give you help messages. Set to NO to turn them off. 
set env MallocHelp=YES 
# might also be set in launch arguments. 
set env NSZombieEnabled=YES 
set env NSDeallocateZombies=NO 
set env MallocCheckHeapEach=100000 
set env MallocCheckHeapStart=100000 
set env MallocScribble=YES 
set env MallocGuardEdges=YES 
set env MallocCheckHeapAbort=1 

set env CFZombie 5 

fb -[_NSZombie init] 
fb -[_NSZombie retainCount] 
fb -[_NSZombie retain] 
fb -[_NSZombie release] 
fb -[_NSZombie autorelease] 
fb -[_NSZombie methodSignatureForSelector:] 
fb -[_NSZombie respondsToSelector:] 
fb -[_NSZombie forwardInvocation:] 
fb -[_NSZombie class] 
fb -[_NSZombie dealloc] 

fb szone_error 

Como se indica por Kendal en un comentario en este post original: Si no tiene un archivo gdbinit sin embargo, Necesita crear un nuevo archivo llamado .gdbinit: colóquelo en su directorio de inicio y llénelo con el contenido provisto. Ahora, cada vez que se inicia gdb, ejecutará los comandos en este archivo.

Espero que esto ayude.

+0

Gracias por su respuesta, pero esto lamentablemente no ayuda. No estoy buscando establecer puntos de interrupción, simplemente quiero que las excepciones se registren en la consola. Consulte el ejemplo que he agregado a la pregunta original anterior. –

0

En todas las partidas ¡shareKit tiene pérdidas de memoria!

¡Todos mis códigos no tienen ningún signo de fuga sino que forman parte de shareKit!

objeto Leaked # Dirección tamaño de la biblioteca Responsible marco NSMallocBlock, 1 0xf641c50 32 Bytes Twitter - [TWInFlightSessionCallInfo setRemoteCall:] TWInFlightSessionCallInfo, 1 0xf676380 16 Bytes de Twitter - [TWSession emptyCallInfo] Malloc 16 Bytes, 1 0xf6457c0 16 Los bytes Twitter - [TWSession recordAndIssueCallInfo:] Malloc 128 Bytes, 2 < múltiples> 256 Bytes libdispatch.dylib dispatch_queue_create $ $ VARIANTE hasta NSLock, 1 0xf64b450 64 Bytes Twitter - [init TWSession] TWSession, 1 0xf62c3e0 32 Bytes Twitter - [ TWTweetComposeViewController session] NSMutableArray, 1 0x2c8540 32 Bytes Twitter - [TWSession init] NSMallocBlock, 1 0x1084ebb0 32 Bytes Twitter - [TWInFlightSessionCallInfo setRemoteCall:]

-1

Probé exactamente con su ejemplo en Xcode 4.6, y me sale el siguiente registro:
*** Terminación de aplicación debido a excepción no detectada 'NSRangeException', razón: ' * - [__ NSArrayI objectAtIndex:]: Índice 1 allá de los límites de matriz vacía'
*** En primer tiro pila de llamadas:
(0x1cd0012 0x110de7e 0x1c85b44 0x4547 0x1121705 0x552c0 0x291a64 0x1121705 0x552c0 0x55258 0x116021 0x11657f 0x1156e8 0x84cef 0x84f02 0x62d4a 0x54698 0x1c2bdf9 0x1c2bad0 0x1c45bf5 0x1c45962 0x1c76bb6 0x1c75f44 0x1c75e1b 0x1c2a7e3 0x1c2a668 0x51ffc 0x285d 0x2785 0x1) libC++ abi.dylib: terminar llamada de lanzamiento una excepción

+0

Bueno, esto no era una pregunta, pero una declaración de que el problema que se mencionó en la pregunta anterior no ocurre en Xcode 4.6. Pensé que esto podría ser útil para abordar el problema ... –

+0

ahh, veo o al menos creo que sí :-) Es como diciendo: _el problema parece resuelto en xyz, aquí está el registro que obtengo_ Si por lo tanto, podría considerar aclararlo un poco (incluido el formato para registrar/rastrear) – kleopatra

+0

Disculpe, si esto no fue lo suficientemente claro. El título de la pregunta es "Excepciones que no están registradas en la consola", y se proporcionó un ejemplo que no registra nada. Simplemente probé este ejemplo en Xcode 4.6, y allí lo logré en la consola. Esta fue mi declaración, y presenté el registro. No sé cómo debería decir más claro. –

0

Puede obtener esto estableciendo un controlador de excepciones no detectadas en su aplicación Deleg comió

void uncaughtExceptionHandler(NSException *exception) 
{ 
    if (exception) 
    { 
     NSLog(@"Exception %@", exception); 
     NSLog(@"Exception Call Stack %@", [exception callStackSymbols]); 
    } 

} 


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    ... 

    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 
0

Capturo las excepciones en mi main.m Esto es lo que he codificado en mi aplicación reciente. También habilito los objetos Zombie en Edit Scheme y también me resulta útil agregar un punto de interrupción de excepción a mi aplicación.

#import <UIKit/UIKit.h> 

#import "AppDelegate.h" 

int main(int argc, char *argv[]) 
{ 
    int retVal; 
    @autoreleasepool { 
     @try 
     { 
      retVal = UIApplicationMain(argc, argv, nil,  NSStringFromClass([AppDelegate class])); 
      } 
     @catch (NSException *exception) 
     { 
      NSLog(@"CRASH===> %@", [exception callStackSymbols]); 
      @throw; 
     } 
     @finally 
     { 

     } 
     return retVal; 
    } 
}