【问题标题】:How to track down strange crashes of iPad app in AQClient thread?如何在 AQClient 线程中追踪 iPad 应用程序的奇怪崩溃?
【发布时间】:2011-11-08 18:50:33
【问题描述】:

我的应用最近开始出现奇怪的崩溃,我无法追查到源头。任何关于寻找什么的帮助都会有所帮助:)

设备(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 时)应用程序崩溃。

我在应用程序中添加了一些NSLogs 来追踪这里发生的事情。关键点的控制台给我展示了这样一个东西:

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

编辑:

我认为这里的关键部分是一开始的双倍原木。当不崩溃时,它只显示一次。而且,问题可能来自两次调用同一对象的dealloc 方法。

【问题讨论】:

    标签: iphone ios crash


    【解决方案1】:

    我会说先处理autorelease 池泄漏,看看问题是否仍然存在。

    【讨论】:

    • 这似乎是非主线程中自动释放池的问题,因为我在这个应用程序中没有做任何多线程的事情,我不使用后台任务 - 我认为它可以我的代码中没有问题...
    • 我想知道这是否与我在代码中使用非原子属性有关。也许这可能导致对变量的双重访问?
    • Console 似乎表明启动音频的代码运行了两次,但引用的是同一个对象,在解除分配之前效果很好。注释掉你开始播放音频的地方之一,即使你认为它是唯一的地方,看看它是否被调用了两次。有可能在电影结尾触发的事件被调用了两次,因此音频启动了两次 - 尝试添加一个布尔标志以确保音频启动例程只运行一次。
    • nonatomic 混淆可能会清除症状性崩溃,但不会阻止音频播放两次的问题。
    • 我的代码中已经有这样的内容...我一个接一个地播放多个音频文件。我在数组中有音频文件,并且在实例变量中有当前播放声音的索引。所以,如果这个调用实际声音播放的方法,在正常情况下会被调用两次,它应该播放不同的音频文件,而不是同一个......
    【解决方案2】:

    我在 iOS5 模拟器中运行的 iPhone 应用程序也遇到了类似的问题。显然,通过这种设置,如果您有一个未定义自动释放池的自动释放对象,系统将立即释放该对象并打印出该消息:“...对象 0x6872ed0 of class TheClass autoreleased without pool in place - 只是泄漏- 中断 objc_autoreleaseNoPool() 以进行调试”。在我的代码中,它甚至在变量赋值之前就释放了对象,所以我保证在那一行之后有不好的内存。要修复,您需要提供一个自动释放池...您可以使用 @autoreleasepool{ ... } 包装分配这些对象的代码(在任何适当的级别),例如:

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

    通过使用@autoreleasepool 定义自动释放池,它会在您使用该对象时保留该数据对象(而不是尝试释放它)。

    另一种解决方案是使用不使用自动释放的方法分配正在释放的对象。我知道使用 NSData,[NSData data] 将返回一个自动释放的对象,而 [[NSData alloc] init] 不会。您正在使用的对象可能有类似物。这显然只有在您控制分配时才有可能......如果不是,您可能会卡在定义自动释放池。

    【讨论】:

      【解决方案3】:

      这可能只发生在模拟器中。我遇到了一个我无法解决的类似问题,但发现它只发生在模拟器中,在所有设备上运行良好。

      【讨论】:

        猜你喜欢
        • 2011-08-23
        • 1970-01-01
        • 2013-09-12
        • 1970-01-01
        • 2012-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多