Сбой приложения iPhone при выходе из фона после истечения срока действия обработчика - PullRequest
1 голос
/ 14 февраля 2012

У меня возникают некоторые проблемы с аварийным завершением приложения iPhone, когда оно происходит из фона, происходит сбой двумя способами.

Вот одна трассировка стека:

    Hardware Model:  iPhone4,1
    Process:         MyApp [11247]
    Identifier:      MyApp
    Code Type:       ARM (Native)
    Parent Process:  launchd [1]
    OS Version:      iPhone OS 5.0.1 (9A406)
    Report Version:  104

    Exception Type:  EXC_CRASH (SIGSEGV)
    Exception Codes: 0x00000000, 0x00000000
    Crashed Thread:  0

    Thread 0 name:  Dispatch queue: com.apple.main-thread
    Thread 0 Crashed:
    0   libsystem_kernel.dylib          0x30938010 0x30937000 + 4112
    1   libsystem_kernel.dylib          0x30938206 0x30937000 + 4614
    2   liblaunch.dylib                 0x3717d114 0x37177000 + 24852
    3   liblaunch.dylib                 0x3717af4a 0x37177000 + 16202
    4   liblaunch.dylib                 0x3717affa 0x37177000 + 16378
    5   CoreTelephony                   0x37c590aa 0x37c42000 + 94378
    6   IMAVCore                        0x3713d15a 0x3711d000 + 131418
    7   IMAVCore                        0x3713d522 0x3711d000 + 132386
    8   CoreFoundation                  0x372396bc 0x371f8000 + 267964
    9   CoreTelephony                   0x37c68f3e 0x37c42000 + 159550
    10  CoreTelephony                   0x37c5929c 0x37c42000 + 94876
    11  CoreFoundation                  0x3727b0c4 0x371f8000 + 536772
    12  libdispatch.dylib               0x33ac2d4e 0x33ac2000 + 3406
    13  libdispatch.dylib               0x33ac4f74 0x33ac2000 + 12148
    14  CoreFoundation                  0x372842d6 0x371f8000 + 574166
    15  CoreFoundation                  0x372074d6 0x371f8000 + 62678
    16  CoreFoundation                  0x3720739e 0x371f8000 + 62366
    17  GraphicsServices                0x313bdfc6 0x313ba000 + 16326
    18  UIKit                           0x3287973c 0x32848000 + 202556
    19  MyApp                           0x00003eae main (main.m:16)
    20  MyApp                           0x00003e6c start + 32

    Thread 1 name:  Dispatch queue: com.apple.libdispatch-manager
    Thread 1:
    0   libsystem_kernel.dylib          0x309383b4 0x30937000 + 5044
    1   libdispatch.dylib               0x33ac5f74 0x33ac2000 + 16244
    2   libdispatch.dylib               0x33ac5c92 0x33ac2000 + 15506

    Thread 2 name:  WebThread
    Thread 2:
    0   libsystem_kernel.dylib          0x30938010 0x30937000 + 4112
    1   libsystem_kernel.dylib          0x30938206 0x30937000 + 4614
    2   CoreFoundation                  0x3728541c 0x371f8000 + 578588
    3   CoreFoundation                  0x37284154 0x371f8000 + 573780
    4   CoreFoundation                  0x372074d6 0x371f8000 + 62678
    5   CoreFoundation                  0x3720739e 0x371f8000 + 62366
    6   WebCore                         0x3305e128 0x32fb6000 + 688424
    7   libsystem_c.dylib               0x31f24c16 0x31f15000 + 64534
    8   libsystem_c.dylib               0x31f24ad0 0x31f15000 + 64208

    Thread 3:
    0   libsystem_kernel.dylib          0x30948cd4 0x30937000 + 72916
    1   libsystem_c.dylib               0x31f1f30a 0x31f15000 + 41738
    2   libsystem_c.dylib               0x31f1f09c 0x31f15000 + 41116

    Thread 4:
    0   libsystem_kernel.dylib          0x30938010 0x30937000 + 4112
    1   libsystem_kernel.dylib          0x30938206 0x30937000 + 4614
    2   CoreFoundation                  0x3728541c 0x371f8000 + 578588
    3   CoreFoundation                  0x37284154 0x371f8000 + 573780
    4   CoreFoundation                  0x372074d6 0x371f8000 + 62678
    5   CoreFoundation                  0x3720739e 0x371f8000 + 62366
    6   Foundation                      0x31c8ab7e 0x31c86000 + 19326
    7   MyApp                       0x00057e7c +[XMPPStream xmppThreadMain] (XMPPStream.m:4089)
    8   Foundation                      0x31c96a8a 0x31c86000 + 68234
    9   Foundation                      0x31d2a59a 0x31c86000 + 673178
    10  libsystem_c.dylib               0x31f24c16 0x31f15000 + 64534
    11  libsystem_c.dylib               0x31f24ad0 0x31f15000 + 64208

    Thread 5 name:  AURemoteIO::IOThread
    Thread 5:
    0   libsystem_kernel.dylib          0x30938010 0x30937000 + 4112
    1   libsystem_kernel.dylib          0x30938206 0x30937000 + 4614
    2   AudioToolbox                    0x373e048a 0x37321000 + 783498
    3   AudioToolbox                    0x373e40ae 0x37321000 + 798894
    4   AudioToolbox                    0x37322aac 0x37321000 + 6828
    5   libsystem_c.dylib               0x31f24c16 0x31f15000 + 64534
    6   libsystem_c.dylib               0x31f24ad0 0x31f15000 + 64208

    Thread 6 name:  com.apple.NSURLConnectionLoader
    Thread 6:
    0   libsystem_kernel.dylib          0x30938010 0x30937000 + 4112
    1   libsystem_kernel.dylib          0x30938206 0x30937000 + 4614
    2   CoreFoundation                  0x3728541c 0x371f8000 + 578588
    3   CoreFoundation                  0x37284154 0x371f8000 + 573780
    4   CoreFoundation                  0x372074d6 0x371f8000 + 62678
    5   CoreFoundation                  0x3720739e 0x371f8000 + 62366
    6   Foundation                      0x31c96bc2 0x31c86000 + 68546
    7   Foundation                      0x31c96a8a 0x31c86000 + 68234
    8   Foundation                      0x31d2a59a 0x31c86000 + 673178
    9   libsystem_c.dylib               0x31f24c16 0x31f15000 + 64534
    10  libsystem_c.dylib               0x31f24ad0 0x31f15000 + 64208

    Thread 7:
    0   libsystem_kernel.dylib          0x30938010 0x30937000 + 4112
    1   libsystem_kernel.dylib          0x30938206 0x30937000 + 4614
    2   CoreFoundation                  0x3728541c 0x371f8000 + 578588
    3   CoreFoundation                  0x37284154 0x371f8000 + 573780
    4   CoreFoundation                  0x372074d6 0x371f8000 + 62678
    5   CoreFoundation                  0x3720739e 0x371f8000 + 62366
    6   Foundation                      0x31c8ab7e 0x31c86000 + 19326
    7   Foundation                      0x31ca452c 0x31c86000 + 124204
    8   MyApp                           0x00070b28 +[GCDAsyncSocket listenerThread] (GCDAsyncSocket.m:6283)
    9   Foundation                      0x31c96a8a 0x31c86000 + 68234
    10  Foundation                      0x31d2a59a 0x31c86000 + 673178
    11  libsystem_c.dylib               0x31f24c16 0x31f15000 + 64534
    12  libsystem_c.dylib               0x31f24ad0 0x31f15000 + 64208

    Thread 8 name:  com.apple.CFSocket.private
    Thread 8:
    0   libsystem_kernel.dylib          0x30948570 0x30937000 + 71024
    1   CoreFoundation                  0x3728966a 0x371f8000 + 595562
    2   libsystem_c.dylib               0x31f24c16 0x31f15000 + 64534
    3   libsystem_c.dylib               0x31f24ad0 0x31f15000 + 64208

    Thread 9 name:  Dispatch queue: cocoa.lumberjack
    Thread 9:
    0   libsystem_kernel.dylib          0x30938060 0x30937000 + 4192
    1   libdispatch.dylib               0x33ac6472 0x33ac2000 + 17522
    2   libdispatch.dylib               0x33ac63d2 0x33ac2000 + 17362
    3   MyApp                           0x0007a3e2 +[DDLog lt_log:] (DDLog.m:922)
    4   MyApp                           0x00079158 __40+[DDLog queueLogMessage:asynchronously:]_block_invoke_0 (DDLog.m:449)
    5   libdispatch.dylib               0x33ac2d4e 0x33ac2000 + 3406
    6   libdispatch.dylib               0x33ac4dc0 0x33ac2000 + 11712
    7   libdispatch.dylib               0x33ac4c56 0x33ac2000 + 11350
    8   libdispatch.dylib               0x33ac5860 0x33ac2000 + 14432
    9   libsystem_c.dylib               0x31f1f1c8 0x31f15000 + 41416
    10  libsystem_c.dylib               0x31f1f09c 0x31f15000 + 41116

    Thread 10:
    0   libsystem_kernel.dylib          0x30948cd4 0x30937000 + 72916
    1   libsystem_c.dylib               0x31f1f30a 0x31f15000 + 41738
    2   libsystem_c.dylib               0x31f1f09c 0x31f15000 + 41116

    Thread 11:
    0   libsystem_kernel.dylib          0x30948cd4 0x30937000 + 72916
    1   libsystem_c.dylib               0x31f1f30a 0x31f15000 + 41738
    2   libsystem_c.dylib               0x31f1f09c 0x31f15000 + 41116

    Thread 12 name:  Dispatch queue: cocoa.lumberjack.fileLogger
    Thread 12:
    0   CoreFoundation                  0x3723875a 0x371f8000 + 264026
    1   Foundation                      0x31cb0722 0x31c86000 + 173858
    2   Foundation                      0x31cb069a 0x31c86000 + 173722
    3   MyApp                           0x001d8510 -[MyCustomFormatter formatLogMessage:] (MyAppDelegate.m:101)
    4   MyApp                           0x0007782c -[DDFileLogger logMessage:] (DDFileLogger.m:986)
    5   MyApp                           0x0007a79e __16+[DDLog lt_log:]_block_invoke_0 (DDLog.m:916)
    6   libdispatch.dylib               0x33ac2d4e 0x33ac2000 + 3406
    7   libdispatch.dylib               0x33ac4dc0 0x33ac2000 + 11712
    8   libdispatch.dylib               0x33ac4c56 0x33ac2000 + 11350
    9   libdispatch.dylib               0x33ac5860 0x33ac2000 + 14432
    10  libsystem_c.dylib               0x31f1f1c8 0x31f15000 + 41416
    11  libsystem_c.dylib               0x31f1f09c 0x31f15000 + 41116

    Thread 13:
    0   libsystem_kernel.dylib          0x30948cd4 0x30937000 + 72916
    1   libsystem_c.dylib               0x31f1f30a 0x31f15000 + 41738
    2   libsystem_c.dylib               0x31f1f09c 0x31f15000 + 41116

    Thread 14:
    0   libsystem_kernel.dylib          0x30948cd4 0x30937000 + 72916
    1   libsystem_c.dylib               0x31f1f30a 0x31f15000 + 41738
    2   libsystem_c.dylib               0x31f1f09c 0x31f15000 + 41116

    Thread 0 crashed with ARM Thread State:
        r0: 0x00000000    r1: 0x03000003      r2: 0x000000bc      r3: 0x00000068
        r4: 0x00000107    r5: 0x00000000      r6: 0x00000000      r7: 0x2fdfe3c8
        r8: 0x00000000    r9: 0x00a80df8     r10: 0x03000003     r11: 0x00000000
        ip: 0xffffffe1    sp: 0x2fdfe38c      lr: 0x3093820d      pc: 0x30938010
      cpsr: 0x200f0010

Другоепохоже и вылетает в Thread 12 в -[MyCustomFormatter formatLogMessage:] (MyAppDelegate.m:101)

Вот код - (NSString *)formatLogMessage:(DDLogMessage *)logMessage:

    NSString *logLevel;
    switch (logMessage->logFlag) {
      case LOG_FLAG_ERROR : logLevel = @"[E]"; break;
      case LOG_FLAG_WARN  : logLevel = @"[W]"; break;
      case LOG_FLAG_INFO  : logLevel = @"[I]"; break;
      default             : logLevel = @"[V]"; break;
    }
    /*line 100*/
    /*line 101*/ NSString *dateAndTime = [dateFormatter stringFromDate:(logMessage->timestamp)];
    /*line 102*/
    NSString *logMsg = logMessage->logMsg;

    NSString *fileName = [NSString stringWithCString:logMessage->file encoding:[NSString defaultCStringEncoding]];

    NSString *function = [NSString stringWithCString:logMessage->function encoding:[NSString defaultCStringEncoding]]; 

    return [NSString stringWithFormat:@"%@ - %@ (%@ - %@) | %@\n", logLevel, dateAndTime, fileName, function, logMsg];

И dateFormatter инициализируется в MyCustomFormatter init:

    - (id)init
    {
        if((self = [super init]))
        {
            self.dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
            [dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];
            [dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss:SSS"];
        }
        return self;
    }

И его интерфейс выглядит следующим образом:

    @interface MyCustomFormatter : NSObject <DDLogFormatter>
    {       
        NSDateFormatter *dateFormatter;
    }

    @property (nonatomic, retain) NSDateFormatter *dateFormatter;

    @end

Мой код в App Delegate - (void)applicationWillResignActive:(UIApplication *)application выглядит следующим образом:

    self.bgTask = [app beginBackgroundTaskWithExpirationHandler:^{

    DDLogInfo(@"Ending bg task in expiration handler");
    //TODO: remove after tests
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:66];

    [[XMPP instance] disconnect];

    [app endBackgroundTask:self.bgTask];

    self.bgTask = UIBackgroundTaskInvalid;

    }];


    // Start the long-running task and return immediately.

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // Do the work associated with the task.

        sleep(600);

        if(self.bgTask != UIBackgroundTaskInvalid){
            //TODO: remove after tests
            [[UIApplication sharedApplication] setApplicationIconBadgeNumber:99];

            DDLogInfo(@"Disconnecting from XMPP in bg task after waited in bg");
            [[XMPP instance] disconnect];

            [app endBackgroundTask:self.bgTask];

            self.bgTask = UIBackgroundTaskInvalid;
        }

    });

И - (void)applicationWillEnterForeground:(UIApplication *)application:

    DDLogVerbose(@"ApplicationWillEnterForeground:");
    if(self.bgTask != UIBackgroundTaskInvalid){
      [[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
      self.bgTask = UIBackgroundTaskInvalid;
    }
    else {
      [[XMPP instance] connect];
    }

Я установил значки, чтобы узнать, работает ли приложение по-прежнему или нет, и как он остановился, и заметил, что приложение вылетает, когда оно открывается из фона со значком *Только 1030 *.

Буду признателен за любую помощь.

Заранее спасибо.

1 Ответ

1 голос
/ 23 февраля 2012

Кажется, проблема была в том, что форматировщик даты не был безопасен для потоков и использовался моими тремя регистраторами одновременно, см. ТА вопрос

...