Как отследить странные сбои приложения iPad в ветке AQClient? - PullRequest
5 голосов
/ 08 ноября 2011

Мое приложение недавно начало показывать странные сбои, которые я не могу отследить до источника. Любая помощь в поиске будет полезна :)

Журналы сбоев с устройства (iOS 5 iPad) вначале показывают следующее:

Date/Time:       2011-11-08 19:07:21.044 +0100
OS Version:      iPhone OS 5.0 (9A334)
Report Version:  104

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x406cad3d
Crashed Thread:  9

Сбой потока 9 является потоком AQClient, и его трассировка стека выглядит следующим образом:

Thread 9 name:  AQClient
Thread 9 Crashed:
0   libobjc.A.dylib                 0x30107fbc objc_msgSend + 16
1   AVFoundation                    0x3420cdc8 _ZL27AudioPlayerAQOutputCallbackPvP16OpaqueAudioQueueP16AudioQueueBuffer + 28
2   AudioToolbox                    0x32a409fe ClientMessageHandler::OutputBufferComplete(unsigned int) + 98
3   AudioToolbox                    0x32a425d6 AQClientCallbackMessageReader::DispatchCallbacks(unsigned char*, unsigned int, void*, unsigned int) + 198
4   AudioToolbox                    0x32a408dc AQCallbackReceiver_CallbackNotificationsAvailable + 364
5   AudioToolbox                    0x329ee4b6 _XCallbackNotificationsAvailable + 54
6   AudioToolbox                    0x329e436c mshMIGPerform + 368
7   CoreFoundation                  0x34fa454c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 32
8   CoreFoundation                  0x34fa44ee __CFRunLoopDoSource1 + 134
9   CoreFoundation                  0x34fa333c __CFRunLoopRun + 1364
10  CoreFoundation                  0x34f264d6 CFRunLoopRunSpecific + 294
11  CoreFoundation                  0x34f2639e CFRunLoopRunInMode + 98
12  AudioToolbox                    0x32a3d29c GenericRunLoopThread::Entry(void*) + 116
13  AudioToolbox                    0x329c5aac CAPThread::Entry(CAPThread*) + 208
14  libsystem_c.dylib               0x35756c16 _pthread_start + 314
15  libsystem_c.dylib               0x35756ad0 thread_start + 0

Похоже, это связано с активностью AVAudioPlayer или MPMoviePlayer. В приложении у меня воспроизводится фильм (.m4v из комплекта приложения), затем, когда он закончится, представление переворачивается в сторону без фильма, и начинается воспроизведение звука.

В случае сбоев я слышу один и тот же звук, воспроизводимый дважды, даже если он не предназначен. Затем по окончании аудио (когда AVAudioPlayer должен быть освобожден) приложение вылетает.

Я добавил несколько NSLog в приложение, чтобы отследить, что здесь происходит. Консоль в критической точке показала мне такую ​​вещь:

Nov  8 19:17:19 unknown XXX[1753] <Warning>: Finished movie
Nov  8 19:17:19 unknown XXX[1753] <Warning>: Finished movie
Nov  8 19:17:20 unknown XXX[1753] <Warning>: flipping
Nov  8 19:17:20 unknown XXX[1753] <Warning>: flipping
Nov  8 19:17:20 unknown XXX[1753] <Warning>: --> dealloc <AVAudioPlayer: 0x6887530> (d2_s3_l3_q9.aif)
Nov  8 19:17:20 unknown XXX[1753] <Warning>: --> dealloc <AVAudioPlayer: 0x6887530> (d2_s3_l3_q9.aif)
Nov  8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x68859f0 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov  8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x11ef30 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov  8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x1a6720 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov  8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x6872400 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug

(...) 

Nov  8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x6872ed0 of class __NSCFDictionary autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov  8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x10cf80 of class __NSCFNumber autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov  8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x6850480 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov  8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x10a530 of class __NSCFNumber autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov  8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x1d15d0 of class __NSCFNumber autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov  8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x6884550 of class TFCrashHandler autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov  8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x685ec10 of class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov  8 19:17:20 unknown UIKitApplication:com.bundle.name[0x2432][1753] <Notice>: objc[1753]: Object 0x6856270 of class __NSCFDictionary autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
Nov  8 19:17:21 unknown com.apple.networkd[1763] <Notice>: main:212 networkd.1763 built Sep 16 2011 00:02:59
Nov  8 19:17:25 unknown ReportCrash[1764] <Notice>: Formulating crash report for process XXX[1753]
Nov  8 19:17:25 unknown com.apple.launchd[1] <Warning>: (UIKitApplication:com.bundle.name[0x2432]) Job appears to have crashed: Segmentation fault: 11
Nov  8 19:17:25 unknown SpringBoard[15] <Warning>: Application 'XXX' exited abnormally with signal 11: Segmentation fault: 11
Nov  8 19:17:25 unknown ReportCrash[1764] <Error>: Saved crashreport to /var/mobile/Library/Logs/CrashReporter/XXX_2011-11-08-191724_iKotapad.plist using uid: 0 gid: 0, synthetic_euid: 501 egid: 0

EDIT:

Ключевой частью здесь, я думаю, являются сдвоенные бревна в начале. Когда не сбой, он появляется только один раз. И проблема может возникнуть из-за вызова метода dealloc одного и того же объекта дважды.

Ответы [ 3 ]

2 голосов
/ 08 ноября 2011

Я бы сказал, что сначала позаботьтесь об утечке из пула autorelease и посмотрите, останется ли проблема.

1 голос
/ 17 ноября 2011

У меня была похожая проблема с приложением iPhone, запущенным в симуляторе iOS5.Очевидно, что при такой настройке, если у вас есть объект автоматического освобождения без определенного пула автоматического выпуска, система немедленно освободит этот объект и распечатает это сообщение: «... Объект 0x6872ed0 класса TheClass автоматически освобожден без пула на месте - просто утечкасломать на objc_autoreleaseNoPool () для отладки ".В моем коде он освобождает объект еще до назначения переменной, поэтому у меня гарантированно будет плохая память после этой строки.Чтобы исправить это, вам нужно предоставить пул авто-релиза ... вы можете обернуть код, который распределяет эти объекты (на любом подходящем уровне) с помощью @autoreleasepool {...}, например:

@autoreleasepool {
    NSData *data = [NSData dataWithBytes:myBytes length:myLength];
    //do something with data
}

ByОпределяя пул автоматического освобождения с помощью @autoreleasepool, он будет держать этот объект данных (не пытаться и не освобождать его), пока вы затем используете этот объект.

Другое решение будет заключаться в распределении объектов, которые освобождаются с помощью метода.который не использует autorelease.Я знаю, что с NSData [NSData data] будет возвращать объект с автоматическим освобождением, тогда как [[NSData alloc] init] не будет.Есть вероятные аналоги с объектами, которые вы используете.Очевидно, что это возможно только в том случае, если вы управляете распределением ... если нет, вы, вероятно, застряли в определении пула автоматического выпуска.

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

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

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