2012-10-12 33 views
38

Tôi đang sử dụng Xcode 4.5.1. Tôi nghĩ đây là hành vi tương đối mới mà tôi đang thấy.Làm cách nào để biết khi nào an toàn để bỏ qua __cxa_throw trên điểm ngắt Tất cả ngoại lệ?

Tôi muốn phát triển và thử nghiệm các dự án của mình với điểm dừng "Tất cả ngoại lệ" được bật.

Tôi đã chạy vào một tình huống mà tôi đang tải hình ảnh thu nhỏ đến các ô trong một chế độ xem bảng, nơi tôi nhận được ngoại lệ __cxa_throw. Khi tôi nhấp vào nút "Tiếp tục thực hiện chương trình", Xcode tiếp tục cách vui vẻ của nó. Tôi nhận được hình thu nhỏ. Ứng dụng dường như hoạt động tốt. Tôi đang tìm một số mẹo về cách tôi có thể xác định xem điều này có an toàn để bỏ qua hay không. Giống như có thể một số gợi ý về sự hiểu biết ngăn xếp dấu vết? Hay cái gì khác?

Dưới đây là đoạn mã:

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); 
     } 
    } 

Đây là những gì tôi nhìn thấy trên stack trace:

#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

Câu hỏi này và câu trả lời bên dưới (nghĩa là chỉ bẫy các ngoại lệ đối tượng tiêu chuẩn-C) cũng áp dụng cho phiên bản Xcode 7.2.1 và các phiên bản sau này. – bluebinary

Trả lời

57

Điều này rõ ràng là sâu bên trong việc thực hiện và C++ trường hợp ngoại lệ có thể là một phần của dòng chảy bình thường, nếu họ đã quyết định sử dụng ngoại lệ để báo lỗi trong nội bộ.

Nếu bạn không tự viết C++ thì để bỏ qua.

Chỉ cần cái bẫy tiêu chuẩn Objective-C ngoại lệ:

objc_exception_throw 
+20

Cảm ơn, trojanfoe. Tôi đã chỉnh sửa điểm ngắt để thay đổi "Ngoại lệ: Tất cả" thành "Ngoại lệ: Mục tiêu-C". Điều đó có ý nghĩa hoàn hảo. –

+5

Chỉ trong trường hợp một người nào đó đạt được điều này và không biết cách làm như vậy :) http://stackoverflow.com/a/14767076/2298217 – iamdavidlam

29

Go đây:

enter image description here

Và làm điều này:

enter image description here

Để tắt chức năng này:

enter image description here

vào đây:

enter image description here

Bạn vẫn sẽ nhận được rất nhiều lợi ích của việc thêm một breakpoint, nhưng sẽ không có vụ tai nạn ứng dụng của bạn cho các công cụ bạn có thể không chịu trách nhiệm cho anyway. Bây giờ nếu bạn đang làm việc với C++ thì bạn nên lo lắng hơn về nó.

+2

Hữu ích, cảm ơn. –

Các vấn đề liên quan