Xcode 4: исключения не регистрируются на консоли - PullRequest
10 голосов
/ 28 июля 2011

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

Пример : в Xcode3, [[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.

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

У меня есть«Log Exceptions» и «Enable Zombie Objects» отмечены на вкладке «Диагностика» окна «Редактирование схемы», но это не помогло.Есть ли другие параметры, которые я мог бы пропустить?

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

Ответы [ 5 ]

0 голосов
/ 07 мая 2014

Я ловлю исключения в моем main.m Вот то, что я кодировал в моем недавнем приложении.Я также включаю объекты «Зомби» в «Редактировать схему» и считаю полезным добавить точку прерывания исключения в мое приложение.

#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;
    }
}
0 голосов
/ 07 июня 2013

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

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 голосов
/ 05 мая 2012

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

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

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

0 голосов
/ 30 января 2013

Я точно попробовал ваш пример в 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 0x1c2a7e30x1c2a668 0x51ffc 0x285d 0x2785 0x1) libc ++ abi.dylib: завершить вызов, выдав исключение

0 голосов
/ 09 августа 2011

Пожалуйста, подумайте над расширением вашего файла 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 он будет выполнять команды в этом файле.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...