2011-07-28 36 views
10

Gần đây tôi đã nâng cấp lên Xcode 4 và chưa tìm ra cách có ngoại lệ và thông báo lỗi được ghi vào bảng điều khiển chạy.Xcode 4: Ngoại lệ không được đăng nhập vào bàn điều khiển

Ví dụ: Trong Xcode 3, [[NSArray array] objectAtIndex:1] kết quả trong những điều sau đây được đăng nhập vào giao diện điều khiển.

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 

ngoại lệ này không đăng nhập bất cứ điều gì ra cửa sổ Console trong Xcode 4.

Tôi có thể xem các cuộc gọi stack bằng cách thêm một breakpoint ngoại lệ - tuy nhiên, tiếp tục quá khứ breakpoint ngoại lệ không đăng nhập bất kỳ thứ gì vào bảng điều khiển (thậm chí không phải là một thông báo SIGABRT hoặc EXC_BAD_ACCESS mơ hồ).

Tôi có "Đăng ngoại lệ" và "Bật đối tượng Zombie" được chọn trong tab Chẩn đoán của cửa sổ Chỉnh sửa của cửa sổ, nhưng nó không giúp được gì. Có bất kỳ cài đặt nào khác mà tôi có thể bị thiếu không?

Cảm ơn rất nhiều.

+0

Có thể điều gì đó ở đây sẽ hữu ích. Xin lỗi, tôi không có bất cứ điều gì cụ thể hơn để cung cấp. http://developer.apple.com/library/mac/#documentation/IDEs/Conceptual/Xcode4TransitionGuide/Debugging/Debugging.html – dcpomero

+0

điều kỳ lạ là tôi đang sử dụng xcode 4 trong MAC Lion và nó chỉ truy tìm ngoại lệ tại cùng một cách của xcode3! Xcode4 bạn có ?! và hệ điều hành nào ?! –

+0

Xcode 4.2 chạy trên Snow Leopard. Tôi chắc chắn tôi chỉ đơn giản là có một cái gì đó cấu hình sai. –

Trả lời

0

Vui lòng xem xét để tăng cường tập tin gdbinit của bạn như sau:

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 

Như đã trình bày bởi Kendal trong một chú thích trong bài gốc này: Nếu bạn không có một tập tin gdbinit nào, Bạn cần tạo một tệp mới có tên .gdbinit - đặt nó vào thư mục chính của bạn và điền nó với nội dung được cung cấp. Bây giờ mỗi khi gdb khởi động nó sẽ thực hiện các lệnh trong tập tin này.

Hy vọng điều này sẽ hữu ích.

+0

Cảm ơn câu trả lời của bạn nhưng tiếc là điều này không giúp ích gì. Tôi không tìm cách thiết lập các điểm ngắt, tôi chỉ muốn các ngoại lệ được ghi vào bàn điều khiển. Vui lòng xem ví dụ tôi đã thêm vào câu hỏi gốc ở trên. –

0

Trong tất cả các phần sau, shareKit có rò rỉ bộ nhớ!

Tất cả các mã của tôi không có dấu hiệu rò rỉ nhưng một phần trong shareKit!

rò rỉ Object # Địa chỉ Kích Phụ trách Thư viện có trách nhiệm Khung NSMallocBlock, 1 0xf641c50 32 Bytes Twitter - [TWInFlightSessionCallInfo setRemoteCall:] TWInFlightSessionCallInfo, 1 0xf676380 16 Bytes Twitter - [TWSession emptyCallInfo] Malloc 16 Bytes, 1 0xf6457c0 16 byte Twitter - [TWSession recordAndIssueCallInfo:] Malloc 128 Bytes, 2 < nhiều> 256 Bytes libdispatch.dylib dispatch_queue_create $ VARIANT $ lên NSLock, 1 0xf64b450 64 Bytes Twitter - [TWSession init] TWSession, 1 0xf62c3e0 32 Bytes Twitter - [ Phiên TWTweetComposeViewController] NSMutableArray, 1 0x2c8540 32 Bytes Twitter - [TWSession init] NSMallocBlock, 1 0x1084ebb0 32 Bytes Twitter - [TWInFlightSessionCallInfo setRemoteCall:]

-1

tôi đã cố gắng chính xác ví dụ của bạn trong XCode 4.6, và tôi nhận được nhật ký sau:
*** Chấm dứt ứng dụng do ngoại lệ không bị bắt 'NSRangeException', lý do: '* - [__ NSArrayI objectAtIndex:]: index 1 vượt quá giới hạn cho mảng trống'
*** Đầu tiên gọi ném stack:
(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: chấm dứt gọi là ném một ngoại lệ

+0

Vâng, điều này là không có câu hỏi, nhưng một tuyên bố rằng vấn đề đã được đề cập trong câu hỏi trên không xảy ra trong Xcode 4.6. Tôi nghĩ rằng điều này có thể hữu ích để tiếp cận vấn đề ... –

+0

ahh, tôi thấy hoặc ít nhất tôi nghĩ như vậy tôi làm :-) Đó là loại nói: _the vấn đề dường như giải quyết trong xyz, đây là nhật ký tôi nhận được_ Nếu Vì vậy, bạn có thể xem xét làm rõ nó một chút (bao gồm cả định dạng để đăng nhập/theo dõi) – kleopatra

+0

Xin lỗi, nếu điều này là không đủ rõ ràng. Tiêu đề của câu hỏi là "Ngoại lệ không được đăng nhập vào giao diện điều khiển", và một ví dụ đã được đưa ra mà không đăng nhập bất cứ điều gì. Tôi chỉ đơn giản là thử ví dụ này trong Xcode 4.6, và ở đó nó đăng nhập vào giao diện điều khiển. Đây là tuyên bố của tôi, và tôi trình bày nhật ký. Tôi không biết làm thế nào tôi nên nói rõ ràng hơn. –

0

Bạn có thể nhận được điều này bằng cách thiết lập trình xử lý ngoại lệ chưa được thực hiện trong App Deleg của bạn ăn.

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

Tôi bắt ngoại lệ trong main.m Đây là những gì tôi đã mã hóa trong ứng dụng gần đây của mình. Tôi cũng cho phép các đối tượng Zombie trong Chỉnh sửa Đề án và tôi cũng thấy hữu ích khi thêm điểm ngắt ngoại lệ vào ứng dụng của tôi.

#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; 
    } 
} 
Các vấn đề liên quan