2012-03-13 73 views
99

每次我打开它已经停止,就像我设置一个断点在这条线的应用:AVAudioPlayer抛出断点在调试模式

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 
* thread #1: tid = 0x1c03, 0x30df1724 libc++abi.dylib`__cxa_throw, stop reason = breakpoint 1.2 
    frame #0: 0x30df1724 libc++abi.dylib`__cxa_throw 
    frame #1: 0x36403a24 AudioToolbox`ID3ParserHandle::ID3ParserHandle(void*, long (*)(void*, unsigned long, unsigned long, unsigned long, void**, unsigned long*)) + 452 
    frame #2: 0x36403b0e AudioToolbox`ID3ParserOpen + 142 
    frame #3: 0x3635bd16 AudioToolbox`MPEGAudioFile::ParseID3Tags() + 58 
    frame #4: 0x3635b9aa AudioToolbox`MPEGAudioFile::ParseAudioFile() + 26 
    frame #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 
    frame #6: 0x36316480 AudioToolbox`AudioFileOpenWithCallbacks + 612 
    frame #7: 0x31f4c1ec AVFoundation`-[AVAudioPlayer initWithData:error:] + 120 

“解决方案”:事实证明,如果我禁用所有异常异常断点,并仅使用Objective-C的异常问题消失断点。但是它并不能解决AVAudioPlayer分配抛出C++异常的问题。

+1

我有同样的堆栈跟踪。禁用“所有异常”断点使它不会发生在我身上。 – makdad 2012-04-25 07:55:45

回答

159

从“所有”到“Objective-C的异常”

添加您的异常断点和编辑异常类型的AudioToolbox一些类经常抛出C++异常。你可以用这种方式过滤它们。

+4

正如我在我的问题中编写了“解决方案”一节,我不认为这是一个解决方案。 AVAudioPlayer不应该抛出随机异常。 – 2012-10-22 06:47:04

+10

“AVAudioPlayer不应该抛出随机异常” - 这不在我们的手中。这就是框架编写的方式,你必须忍受它。虽然,我同意这不是一个好主意 – Mugunth 2013-01-11 17:52:45

+0

@Mugunth这是否意味着框架正在响应和纠正内部错误?你知道有关于它的任何其他文件吗?我无法在网上找到很多,这暗示了这可能是由于程序员错误造成的...... – Remover 2013-09-13 09:35:08

20

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

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

当/如果应用程序曾经抛出一个抛出的异常,我cmd-6,启用该断点,并重新运行,并做我做任何事情时,它坠毁。

编辑:设置为“Objective-C异常”显然是怎么做到的。看到上面的答案!

2

回溯帮助了很多,谢谢!我们最近开始遇到同样的问题。事实证明,它所投的mp3文件没有一个有效的ID3标签,并且通过诸如Tagr之类的应用程序运行它们,从而将它们固定了起来!

+1

在ID3标记中设置了缺少的字段后,应用程序在AVAudioPlayer的初始化过程中不再停止,但它仍停在播放说明... – 2014-10-15 06:46:55

+0

需要哪些字段?他们全部? – Reggian 2016-11-02 14:33:03

+0

@Reggian我不记得,这是很久以前。对于那个很抱歉!如果我没有记错的话,我不记得需要添加任何缺失的字段,只需要通过标签消毒器运行即可。 – 2016-11-04 18:25:23

-4

尝试将AVAudioPlayer设置为类变量!

+1

在我的情况下,我已经将AVAudioPlayer设置为一个类变量,但它仍然不起作用。看起来你并不知道解决方案 – 2015-03-31 14:31:46

4

下面是显示我如何修复此错误的屏幕截图。我不确定这是否与上述答案一样,但我认为它是类似的。

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

enter image description here

1

在Xcode中9.2你见过他们之后,你可以禁用特定的例外。 打开断点菜单,然后单击禁用(褪色箭头)

enter image description here