【问题标题】:Crash in release, but not debug发布时崩溃,但未调试
【发布时间】:2014-03-18 16:48:39
【问题描述】:

我正在编写一个使用音频队列服务来播放音乐的应用程序。当它到达一首歌曲的结尾时,它应该继续下一首。在调试方案中运行良好,但在发布方案中崩溃

Process:         xxx [1136]
Path:            /Users/USER/Desktop/btunes.app/Contents/MacOS/xxx
Identifier:      xxx
Version:         1.0 (1)
Code Type:       X86-64 (Native)
Parent Process:  launchd [152]
Responsible:     xxx [1136]
User ID:         501

Date/Time:       2014-03-18 09:33:15.557 -0700
OS Version:      Mac OS X 10.9.2 (13C64)
Report Version:  11
Anonymous UUID:  57FFD284-4D30-889E-73D0-CE978BAFC774


Crashed Thread:  6  com.apple.coreaudio.AQClient

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000280000018

VM Regions Near 0x280000018:
    CG shared images       00000001c7eb2000-00000001c7eba000 [   32K] r--/r-- SM=SHM  
--> 
    JS JIT generated code  00005b8cc8000000-00005b8cc8001000 [    4K] ---/rwx SM=NUL  

Application Specific Information:
objc_msgSend() selector name: delegate


Thread 6 Crashed:: com.apple.coreaudio.AQClient
0   libobjc.A.dylib                 0x00007fff85742097 objc_msgSend + 23
1   com.cluttered.btunes            0x000000010aced249 -[BTSAudioStreamer handleAudioQueueProperty] + 136 (BTSAudioStreamer.m:180)
2   com.apple.audio.toolbox.AudioToolbox    0x00007fff87af6f6d ClientAudioQueue::PropertyChanged(unsigned int) + 415
3   com.apple.audio.toolbox.AudioToolbox    0x00007fff87afc97c AQClientCallbackMessageReader::DispatchCallbacks(void const*, unsigned long) + 440
4   com.apple.audio.toolbox.AudioToolbox    0x00007fff87af742e ClientAudioQueue::FetchAndDeliverPendingCallbacks(unsigned int) + 334
5   com.apple.audio.toolbox.AudioToolbox    0x00007fff87af7554 AQCallbackReceiver_CallbackNotificationsAvailable + 129
6   com.apple.audio.toolbox.AudioToolbox    0x00007fff87b1777c _XCallbackNotificationsAvailable + 48
7   com.apple.audio.toolbox.AudioToolbox    0x00007fff87b111bf mshMIGPerform + 153
8   com.apple.CoreFoundation        0x00007fff81adc9a9 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 41
9   com.apple.CoreFoundation        0x00007fff81adc91e __CFRunLoopDoSource1 + 478
10  com.apple.CoreFoundation        0x00007fff81acda16 __CFRunLoopRun + 1830
11  com.apple.CoreFoundation        0x00007fff81acd0b5 CFRunLoopRunSpecific + 309
12  com.apple.audio.toolbox.AudioToolbox    0x00007fff87afe479 GenericRunLoopThread::Entry(void*) + 187
13  com.apple.audio.toolbox.AudioToolbox    0x00007fff87ab7c0d CAPThread::Entry(CAPThread*) + 109
14  libsystem_pthread.dylib         0x00007fff87db1899 _pthread_body + 138
15  libsystem_pthread.dylib         0x00007fff87db172a _pthread_start + 137
16  libsystem_pthread.dylib         0x00007fff87db5fc9 thread_start + 13

第 180 行是

if (self.delegate) {

委托是(弱),我在 dealloc 中将 self.delegate 设置为 nil。即使在我删除它之后,音频队列属性侦听器似乎仍在运行(我也在 dealloc 中这样做)。

我不明白为什么它只发生在发布模式下。现在我只是在 Debug 中归档应用程序,但这显然不理想。有什么想法吗?

【问题讨论】:

  • 我最近遇到了类似的问题(不是音频),但我很想说 XCode 5.0.2 中有一个错误。
  • @FlavorScape,这似乎是我的问题;虽然提示没有说明优化是否保留在none 上以供发布。顺便说一句,我试图只为fast 设置优化并且发布版本崩溃了。所以看起来none 是这里唯一的选择。我以前从未遇到过这种情况,所以我不明白为什么它会突然影响与以前完全一样编译的应用程序的发布版本。

标签: macos cocoa core-audio audioqueueservices


【解决方案1】:

解释/引用this post 以便保留知识。

看起来不同的优化级别存在问题。在 fast 优化运行会在某些环境中导致崩溃。

“让我印象深刻的差异之一是 Optimization Level 设置。Debug 版本设置为 None [-O0],而 Release 版本设置为 Fastest, Smallest [-Os]。

我将调试设置更改为最快、最小 [-Os] 和 BOOM,每次运行它都会在 iPhone 3G 上崩溃。将其切换回 None [-O0] 会恢复正确的行为。”

另见Related SO Question。

【讨论】:

  • 知道为什么优化会首先导致问题吗?
  • 尝试在快速模式下运行调试版本。然后查看是哪个特定模块导致了问题。
  • 这很可能是当您将 char 等类型转换为 int 等时。它通常是由 int 和 char 等原始类型中的错误字节签名引起的。优化会更改类型的内存分配,并导致问题。尝试 memcpy / memmove 而不是强制转换。限制可以是特定于硬件的。避免投射。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多