Xcode 异常断点总是在属性上暂停

Posted

技术标签:

【中文标题】Xcode 异常断点总是在属性上暂停【英文标题】:Xcode Exception Breakpoint Always Pauses On Property 【发布时间】:2013-06-17 14:23:58 【问题描述】:

这让我发疯了很长时间。我正在使用 Xcode 4.6,但这已经发生在几个版本中。当我打开断点并添加异常断点时,它总是在我设置音频播放器的代码行上暂停。我在之前和之后设置了一些相同的方式,但它只在那个暂停。

这是我正在使用的代码:

    [[AVAudiosession sharedInstance] setDelegate: self];
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil];

    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error: &activationError];

    self.playedSongs = [NSMutableSet setWithCapacity:9];
    [self loadSettingsFromFile];
    NSURL *sfxPath = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"Snap.aiff" ofType:nil]];
    self.snapSfx = [[[AVAudioPlayer alloc]initWithContentsOfURL:sfxPath error:nil]autorelease];
    self.snapSfx.volume = 1.f;

    NSURL *fireworksPath;
    if ([OriginalIPadChecker isNotiPadOriginal]) 
        fireworksPath = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"FireworksSFX.mp3" ofType:nil]];
   
    else
        fireworksPath = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"NoFireworksSFX.mp3" ofType:nil]];
    
    self.fireWorksSfx = [[[AVAudioPlayer alloc]initWithContentsOfURL:fireworksPath error:nil]autorelease];
    self.fireWorksSfx.volume = 1.f;

    NSURL *poofPath = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"Remove Poof.mp3" ofType:nil]];

    //The line below is the one that it pauses on
    self.removePoof = [[[AVAudioPlayer alloc]initWithContentsOfURL:poofPath error:nil]autorelease];
    self.removePoof.volume = 1.f;

    NSURL *newHighScorePath = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"New High Score.mp3" ofType:nil]];
    self.theNewHighScore = [[[AVAudioPlayer alloc]initWithContentsOfURL:newHighScorePath error:nil]autorelease];
    self.theNewHighScore.volume = 1.f;

    NSURL *badgeInTrophyPath = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"Badge In Trophy.aiff" ofType:nil]];
    self.badgeInTrophy = [[[AVAudioPlayer alloc]initWithContentsOfURL:badgeInTrophyPath error:nil]autorelease];
    self.badgeInTrophy.volume = 1.f;

    NSURL *dingPath = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"Ding.aif" ofType:nil]];
    self.ding = [[[AVAudioPlayer alloc]initWithContentsOfURL:dingPath error:nil]autorelease];
    self.ding.volume = 1.f;

应用程序不会崩溃并且声音播放正常,但调试器总是在那一行暂停——即使我将它移到其他地方,它仍然会暂停。我可以继续执行,它工作得很好,但这真的让我很烦。

我不明白为什么它会暂停。有什么想法吗?

【问题讨论】:

你在 XCode v4.6.2 吗? @MarcusAdams 4.6.1 但正如我所说,这已经发生在许多版本中,我认为这不仅仅是 xcode 中的一个错误。 【参考方案1】:

正如Xcode stops on prepareToPlay 的评论中所解释的,断点的原因是您设置了一个“所有异常”类型的通用断点,它响应由 c++ 库触发的信号。最好使用“Objective-c”异常断点,这样可以保护这种情况。

【讨论】:

【参考方案2】:

试试这个并更新关于它在哪里停止的问题(如果它停止):

AVAudioPlayer *foo;
NSError *error = nil;
assert(poofPath);

foo = [AVAudioPlayer alloc];
foo = [foo initWithContentsOfURL:poofPath error:&error];
assert(foo);
[self setRemovePoof:foo];
[foo release];

如果断言生效,那可能是 Apple 的问题。不幸的是,有一些 Apple 内部框架使用 try/catch 的情况,它们会触发断点。它并不常见,但确实会发生。

如果最终 foo 不是 nil 并且错误也是 nil,那么您能做的最好的事情就是在 bugreporter.apple.com 上输入错误报告(这会很棒)。另外,您是否查看过 poofPath - URL 是否有可能返回原始音频以外的任何内容?

我的猜测是 Apple 尝试打开和处理该文件,但由于该文件存在“奇怪”或异常情况,它会出现内部异常。然后框架做额外的工作,并设法读取文件。所以你得到你的声音,但也有例外。取一些常见类型的 mp3 并将其放入您的应用程序包中,然后尝试打开它。看看它(可能还有其他一些文件)是否给出了相同的错误。或者创建一个带有声音的演示项目并上传(最后您可能需要在错误报告中将演示项目提交给 Apple)。这类事情应该报告错误。

编辑:不幸的是,Apple 内部框架有时会使用 try/catch,它们会触发断点。然后,如前所述,后来的一些代码终于弄清楚了如何解码文件并做到了。

原发帖人在评论中回应说这个特定文件是用 Audacity 创建的,并且听说这些文件经常有解码问题。

【讨论】:

它停在“foo = [foo initWithContentsOfURL:poofPath error:&error];”此外,没有错误。 不幸的是,苹果内部框架有使用try/catch的情况,它们会触发断点。它并不常见,但确实会发生。我假设最后那个 foo 不是 nil 并且错误也是 nil。此时,您能做的最好的事情就是在 bugreporter.apple.com 上输入错误报告(这会很棒)。另外,您是否查看过 poofPath - URL 是否有可能返回原始音频以外的任何内容? 它肯定会返回一个 MP3,但至于“原始”我不确定你的意思。我该如何检查? 我在想的是苹果试图打开和处理文件,它得到一个内部异常,因为文件有一些“奇怪”或异常。然后框架做额外的工作,并设法读取文件。所以你得到你的声音,但也有例外。取一些常见类型的 mp3 并将其放入您的应用程序包中,然后尝试打开它。看看它(可能还有其他一些文件)是否给出了相同的错误。或者创建一个带有声音的演示项目并上传(最后您可能需要在错误报告中将演示项目提交给 Apple)。这类事情应该报告错误。 所以我知道已经有一段时间了,但我尝试了不同的 MP3,但它并没有在断点处停止。那个特定的 mp3 是使用 Audacity 保存的,从那以后我了解到从那里保存的 mp3 经常有问题。您能否更新您的答案以包含来自您的 cmets 的信息,以便我接受它?非常感谢。

以上是关于Xcode 异常断点总是在属性上暂停的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Xcode 在测试代码出现异常时停止?

异常或崩溃断点总是转到 main.m

Xcode 4.3.2 + iOS SDK 5.1 异常断点不起作用

idea debug小技巧

AppDelegate 中的异常断点

Xcode 4.6.1 调试器局部变量不可用