【问题标题】:AVAudioPlayer throws breakpoint in debug modeAVAudioPlayer 在调试模式下抛出断点
【发布时间】:2012-03-29 19:48:18
【问题描述】:

每次我加载应用程序时,它都会停止,就好像我在这一行设置了一个断点:

self.audioPlayer = 
 [[[AVAudioPlayer alloc] initWithData:[dataPersister loadData:self.fileName] 
                                error:&outError] autorelease];

这条线上方或附近没有任何断点。只有当我在调试模式下运行应用程序并且断点后没有崩溃时才会发生这种情况。当我点击“继续执行程序”时,应用程序没有任何反应。

这是loadData方法,用initWithData调用:

-(NSData*)loadData:(NSString*)fileName
{
    NSString *dataPath = [self.path stringByAppendingPathComponent:fileName];
    dataPath = [dataPath stringByStandardizingPath];
    NSData *data = [[[NSData alloc] initWithContentsOfFile:dataPath]autorelease ];
    return data;
}

loadData 函数似乎工作正常。断点后加载和播放请求的 mp3 文件没有任何问题。

你知道我做错了什么吗?

编辑: 当它在断点处停止时,我运行了回溯。这是输出:

(lldb) BT * 线程 #1:tid = 0x1c03,0x30df1724 libc++abi.dylib`__cxa_throw,停止原因 = 断点 1.2 帧#0:0x30df1724 libc++abi.dylib`__cxa_throw 帧 #1: 0x36403a24 AudioToolbox`ID3ParserHandle::ID3ParserHandle(void*, long (*)(void*, unsigned long, unsigned long, unsigned long, void**, unsigned long*)) + 452 帧 #2:0x36403b0e AudioToolbox`ID3ParserOpen + 142 帧#3:0x3635bd16 AudioToolbox`MPEGAudioFile::ParseID3Tags() + 58 帧 #4: 0x3635b9aa AudioToolbox`MPEGAudioFile::ParseAudioFile() + 26 帧 #5: 0x3631723e AudioToolbox`AudioFileObject::DoOpenWithCallbacks(void*, long (*)(void*, long long, unsigned long, void*, unsigned long*), long (*)(void*, long long, unsigned long , void const*, unsigned long*), long long (*)(void*), long (*)(void*, long long)) + 166 帧#6:0x36316480 AudioToolbox`AudioFileOpenWithCallbacks + 612 帧 #7: 0x31f4c1ec AVFoundation`-[AVAudioPlayer initWithData:error:] + 120

“解决方案”: 事实证明,如果我为所有异常禁用异常断点并且只对 Objective-C 异常使用断点,问题就会消失。但是并没有解决分配AVAudioPlayer抛出C++异常的问题。

【问题讨论】:

  • 我有相同的堆栈跟踪。禁用“所有异常”断点使我不会发生这种情况。

标签: ios objective-c iphone cocoa-touch avaudioplayer


【解决方案1】:

添加您的异常断点并将异常类型从“All”编辑为“Objective-C exceptions”

AudioToolbox 中的某些类会引发常规 C++ 异常。您可以通过这种方式过滤掉它们。

【讨论】:

  • 正如我在我的问题中写的“解决方案”部分,我不认为这是一个解决方案。 AVAudioPlayer 不应抛出随机异常。
  • “AVAudioPlayer 不应该抛出随机异常”——这不在我们手中。这就是框架的编写方式,你必须忍受它。不过,我同意这不是一个好主意
  • @Mugunth 这是否意味着框架正在响应和纠正内部错误?你知道关于它的任何其他文件吗?我在网上找不到太多这表明这可能是由于程序员错误...
【解决方案2】:

AVAudioPlayer 和 AVAudioRecorder 都会抛出异常,其中有几个。这些由玩家在内部处理,但如果你有一个“所有断点”的断点(即异常:全部,中断:抛出),你将捕获这些异常。如果您继续执行这些,应用程序将继续正常运行并且根本不会崩溃。

目前为止我想出的唯一解决方案是单击断点导航器中的断点栏,禁用此特定断点,然后在禁用的情况下运行。

当/如果应用程序因抛出异常而崩溃时,我 cmd-6,启用该断点,然后重新运行并执行我在崩溃时所做的任何事情。

编辑:设置为“Objective-C exceptions”显然是如何做到的。见上面的答案!

【讨论】:

    【解决方案3】:

    这是显示我如何修复此错误的屏幕截图。我不确定这是否与上面的答案所谈论的方式相同,但我认为它是相似的。

    1. 转到 Xcode 中的断点导航器。
    2. 按住 Control 键并单击“所有例外”行。
    3. 选择“编辑断点...”选项。
    4. ExceptionAll 更改为 Objective-C

    【讨论】:

      【解决方案4】:

      回溯帮助很大,谢谢!我们最近开始遇到同样的问题。事实证明,它抛出的 mp3 文件没有有效的 ID3 标签,并通过诸如 Tagr 之类的应用程序运行它们,从而修复了它们!

      【讨论】:

      • 在ID3标签设置缺失字段后,应用在初始化AVAudioPlayer时不再停止,而是在播放指令处停止...
      • 哪些字段是必需的?全部?
      • @Reggian 我不记得了,那是很久以前的事了。对于那个很抱歉!我不记得需要添加任何丢失的字段,如果我没记错的话,只需通过标签清理程序运行它就足够了!
      【解决方案5】:

      在 Xcode 9.2 中,您可以在查看特定异常后禁用它们。 打开断点菜单并单击以禁用(淡化箭头)

      【讨论】:

        【解决方案6】:

        尝试将 AVAudioPlayer 设置为类变量!

        【讨论】:

        • 在我的情况下,我已经将 AVAudioPlayer 设置为类变量,但它仍然不起作用。看来你真的不知道解决方案
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-23
        • 1970-01-01
        • 2014-09-01
        • 1970-01-01
        • 2016-01-23
        相关资源
        最近更新 更多