AVAudioPlayer在调试模式下引发断点


108

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

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 ++异常的问题。


2
我有相同的堆栈跟踪。禁用“所有异常”断点使其对我而言不会发生。
makdad 2012年

Answers:


175

添加异常断点,并将异常类型从“全部”编辑为“ Objective-C异常”

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


6
当我在问题中写下“解决方案”部分时,我不认为这是解决方案。本AVAudioPlayer不应该抛出随机异常。
ThomasCle 2012年

10
“ AVAudioPlayer不应抛出随机异常”-这不在我们手中。这就是框架的编写方式,您必须忍受它。不过,我同意这不是一个好主意
Mugunth 2013年

@Mugunth这是否表示框架正在响应并纠正内部错误?您是否知道其他任何文档?我在网上找不到太多内容,这暗示我这可能是程序员出错的原因……
Remover

21

AVAudioPlayer和AVAudioRecorder都将引发异常,其中有几个。这些是由玩家内部处理的,但是如果您有“所有断点”的断点(即例外:全部,休息:投掷),您将捕获这些例外。如果您继续执行这些操作,则该应用将继续正常运行,并且完全不会崩溃。

到目前为止,我想出的唯一解决方案是单击Breakpoint Navigator中的Breakpoint栏,禁用此特定的Breakpoint,并禁用它。

当/如果应用程序因抛出异常而崩溃时,我将执行cmd-6,启用该断点,然后重新运行并执行崩溃时的所有操作。

编辑:设置为“ Objective-C异常”显然是方法。见上面的答案!


9

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

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

在此处输入图片说明


2

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


1
在ID3标签中设置了缺少的字段后,该应用程序不再在AVAudioPlayer的初始化时停止,但仍在播放指令处停止了
ReinhardMänner2014年

需要哪些字段?他们全部?
reggian

@Reggian我不记得了,那是很久以前的事了。对于那个很抱歉!我不记得需要添加任何缺少的字段,如果我没记错的话,只需通过标签清理器运行它就足够了!
yo.ian.g

2

在Xcode 9.2中,您可以在看到特定的异常后将其禁用。打开断点菜单,然后单击以禁用(渐变箭头)

在此处输入图片说明


-4

尝试将AVAudioPlayer设置为类变量!


1
就我而言,我已经将AVAudioPlayer设置为类变量,但它仍然无法正常工作。看来您不太了解解决方案
Alex Cio 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.