2012-10-12 59 views
38

Estoy en Xcode 4.5.1. Creo que este es un comportamiento relativamente nuevo que estoy viendo.¿Cómo puedo saber cuándo es seguro ignorar __cxa_throw en un punto de interrupción de Todas las Excepciones?

Prefiero desarrollar y probar mis proyectos con el punto de interrupción "Todas las excepciones" habilitado.

Me he estado encontrando con un escenario en el que estoy cargando imágenes en miniatura a las celdas en una vista de tabla, donde recibo una excepción de __cxa_throw. Cuando hago clic en el botón "Continuar ejecución del programa", Xcode continúa de forma feliz. Obtengo las miniaturas. La aplicación parece funcionar bien. Estoy buscando algunos consejos sobre cómo puedo determinar si esto es algo seguro de ignorar. Al igual que tal vez algunos consejos sobre la comprensión del rastro de la pila? ¿O algo mas?

Aquí es el fragmento de código:

NSString *imageStr = item.thumbURL; 
    imageStr = [imageStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
    NSURL *imageURL; 

    if (![imageStr isEqualToString:@""]) { 
     imageURL = [NSURL URLWithString:imageStr]; 
     NSLog(@"imageURL: %@",imageURL); 
     if (imageURL == nil) { 
      NSLog(@"imageUrl was nil for string: %@",imageStr); 
     } else { 
      UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
      //spinner.frame = CGRectMake(cell.imageView.frame.size.width/2,cell.imageView.frame.origin.y + cell.imageView.frame.size.height/2,cell.imageView.frame.size.width,cell.imageView.frame.size.height); 
      spinner.frame = CGRectMake(10,20,40,40); 
      [spinner startAnimating]; 
      [cell addSubview:spinner]; 

      dispatch_queue_t downloadQueue = dispatch_queue_create("thumbnail downloader", NULL); 
      dispatch_async(downloadQueue, ^{ 
       NSLog(@"Network request for tour_thumb image: %@",imageStr); 
       UIImage *img = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:imageURL]]; 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        [spinner removeFromSuperview]; 
        UIImageView *imgView=[[UIImageView alloc] initWithFrame:CGRectMake(8, 8, cell.contentView.frame.size.width/2 - 16, cell.contentView.frame.size.height - 16)]; 
        imgView.image = img; 
        [cell.contentView addSubview:imgView]; 
       }); 
      }); 
      dispatch_release(downloadQueue); 
     } 
    } 

Esto es lo que veo en el seguimiento de pila:

#0 0x34a9c524 in __cxa_throw() 
#1 0x387014ce in AddChildNode(XMP_Node*, XML_Node const&, char const*, bool)() 
#2 0x38700d22 in RDF_LiteralPropertyElement(XMP_Node*, XML_Node const&, bool)() 
#3 0x3870094e in RDF_PropertyElementList(XMP_Node*, XML_Node const&, bool)() 
#4 0x38700608 in ProcessRDF(XMP_Node*, XML_Node const&, unsigned int)() 
#5 0x3871480a in XMPMeta::ParseFromBuffer(char const*, unsigned int, unsigned int)() 
#6 0x387095c0 in WXMPMeta_ParseFromBuffer_1() 
#7 0x38725578 in TXMPMeta<std::string>::ParseFromBuffer(char const*, unsigned int, unsigned int)() 
#8 0x387254de in TXMPMeta<std::string>::TXMPMeta(char const*, unsigned int)() 
#9 0x38722b70 in CreateMetadataFromXMPDataInternal(char const*, unsigned long, unsigned int)() 
#10 0x38739a50 in readXMPProperties() 
#11 0x386a01fc in readXMPData() 
#12 0x3868cec8 in initImageJPEG() 
#13 0x3868c2ee in _CGImagePluginInitJPEG() 
#14 0x3867e274 in makeImagePlus() 
#15 0x3867ddde in CGImageSourceCreateImageAtIndex() 
#16 0x38e117b6 in _UIImageRefFromData() 
#17 0x38e116c6 in -[UIImage initWithData:]() 
#18 0x0004cb0a in __57-[ViewController tableView:cellForRowAtIndexPath:]_block_invoke_0 at ViewController.m:335 
#19 0x313fc792 in _dispatch_call_block_and_release() 
#20 0x313ffb3a in _dispatch_queue_drain() 
#21 0x313fd67c in _dispatch_queue_invoke() 
#22 0x31400612 in _dispatch_root_queue_drain() 
#23 0x314007d8 in _dispatch_worker_thread2() 
#24 0x394767f0 in _pthread_wqthread() 
#25 0x39476684 in start_wqthread() 
+1

Esta pregunta y la respuesta a continuación (es decir, que solo atrapa las excepciones estándar de Objective-C) se aplican también a Xcode 7.2.1 y también a las versiones posteriores. – bluebinary

Respuesta

57

Esto es, obviamente, en lo profundo de la aplicación y excepciones de C++ puede ser parte de la flujo normal, si han decidido usar excepciones para señalar errores internamente.

Si no está escribiendo ningún C++ usted mismo entonces es seguro de ignorar.

Sólo trampa de la norma de Objective-C excepción:

objc_exception_throw 
+20

Gracias, trojanfoe. Edité el punto de interrupción para cambiar "Excepción: Todos" a "Excepción: Objetivo-C". Eso tiene perfecto sentido. –

+5

En caso de que alguien llegue a esto y no sepa cómo hacerlo :) http://stackoverflow.com/a/14767076/2298217 – iamdavidlam

29

entra aquí:

enter image description here

Y ello:

enter image description here

Para activar esta:

enter image description here

en esto:

enter image description here

Usted todavía obtener una gran cantidad del beneficio de añadir un punto de interrupción, pero no tendrá su desplome de aplicación para cosas que probablemente no está responsable de todos modos. Ahora, si trabajas con C++, entonces mejor que te preocupes por eso.

+2

Útil, gracias. –

Cuestiones relacionadas