Xcode 4: Исключения, не регистрируемые на консоли

Недавно я обновился до Xcode 4 и еще не понял, как иметь исключения и сообщения об ошибках, зарегистрированные на консоли запуска.

Пример. В Xcode 3, [[NSArray array] objectAtIndex:1] приводит к тому, что на консоль записывается следующее.

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

Это исключение не записывает ничего на консоль в Xcode 4.

Я могу просмотреть стек вызовов, добавив контрольную точку исключения, однако, продолжая простую точку останова исключений, ничего не записывать на консоль (даже не смутное сообщение SIGABRT или EXC_BAD_ACCESS).

У меня есть "Исключения журнала" и "Включить объекты зомби", отмеченные на вкладке "Диагностика" окна "Редактировать схему", но это не помогло. Есть ли какие-либо другие настройки, которые я мог бы пропустить?

Большое спасибо.

Ответ 1

Пожалуйста, подумайте над улучшением вашего файла gdbinit следующим образом:

Как установить эти точки останова в ~/.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

Как заявил Кендал в комментарии в этом оригинальном сообщении: Если у вас еще нет файла gdbinit, вам нужно создать новый файл с именем .gdbinit - поместить его в свой домашний каталог и заполнить его предоставленным контентом. Теперь каждый раз, когда запускается gdb, он выполняет команды в этом файле.

Надеюсь, что это поможет.

Ответ 2

Во всех последующих файлах shareKit имеет утечки памяти!

Все мои коды не имеют признаков утечки, но часть в shareKit!

Просочившийся объект # Размер адреса Ответственная библиотека Ответственный кадр NSMallocBlock, 1 0xf641c50 32 байта Twitter - [TWInFlightSessionCallInfo setRemoteCall:] TWInFlightSessionCallInfo, 1 0xf676380 16 Bytes Twitter - [TWSession emptyCallInfo] Malloc 16 байт, 1 0xf6457c0 16 байтов Twitter - [TWSession recordAndIssueCallInfo:] Malloc 128 Bytes, 2 < несколько > 256 байт libdispatch.dylib dispatch_queue_create $VARIANT $up NSLock, 1 0xf64b450 64 байта Twitter - [TWSession init] TWSession, 1 0xf62c3e0 32 Bytes Twitter - [TWTweetComposeViewController session] NSMutableArray, 1 0x2c8540 32 байта Twitter - [TWSession init] NSMallocBlock, 1 0x1084ebb0 32 байта Twitter - [TWInFlightSessionCallInfo setRemoteCall:]

Ответ 3

Вы можете получить это, установив обработчик исключенных исключений в своем делете приложения.

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

}


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

   NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);

Ответ 4

Я уловил исключения в моем main.m Вот что я закодировал в своем недавнем приложении. Я также включаю объекты Zombie в Edit Scheme, и также мне полезно добавить контрольную точку исключения для моего приложения.

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

Ответ 5

Я попробовал именно ваш пример в XCode 4.6, и я получил следующий журнал:
*** Завершение приложения из-за неперехваченного исключения "NSRangeException", причина: "* - [__ NSArrayI objectAtIndex:]: индекс 1 за пределами для пустого массива"
*** Первый стек вызовов броска:
(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) libС++ abi.dylib: завершение вызова throwing exception