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
同じスタックトレースがありました。「すべての例外」ブレークポイントを無効にすると、私には起こりませんでした。
マクダッド2012

回答:


175

例外ブレークポイントを追加し、例外タイプを「すべて」から「Objective-C例外」に編集します。

AudioToolboxの一部のクラスは、通常のC ++例外をスローします。この方法でそれらをフィルタリングできます。


6
私が質問の「解決策」セクションを書いたので、私はこれを解決策とは考えていません。AVAudioPlayerランダムな例外をスローしてはいけません。
ThomasCle

10
「AVAudioPlayerはランダムな例外をスローすべきではありません」-これは私たちの手にはありません。これがフレームワークの記述方法であり、それと共存する必要があります。しかし、それは良い考えではないことに同意します
Mugunth 2013年

@Mugunthこれは、フレームワークが内部エラーに応答して修正していることを意味しますか?それに関する他のドキュメントを知っていますか?オンラインで見つけることができないので、これはプログラマエラーの
せい

21

AVAudioPlayerとAVAudioRecorderの両方が例外をスローします。これらはプレーヤーによって内部的に処理されますが、「すべてのブレークポイント」にブレークポイントがある場合(つまり、例外:すべて、ブレーク:スロー中)、これらの例外をキャッチします。これらで実行を続けると、アプリは通常どおりに実行され、まったくクラッシュしません。

これまでに思いついた唯一の解決策は、ブレークポイントナビゲーターのブレークポイントバーをクリックして、この特定のブレークポイントを無効にし、無効にして実行することです。

例外がスローされてアプリがクラッシュした場合は、cmd-6、そのブレークポイントを有効にして、クラッシュしたときに実行したことをすべて再実行します。

編集:「Objective-C例外」に設定することは明らかにそれを行う方法です。上記の答えを見てください!


9

このエラーの修正方法を示すスクリーンショットを次に示します。これが上記の回答と同じかどうかはわかりませんが、同じようなものだと思います。

  1. XcodeのBreakpointナビゲーターに移動します。
  2. [すべての例外]行をコントロールクリックします。
  3. 「ブレークポイントの編集...」オプションを選択します。
  4. ExceptionからAllに変更しObjective-Cます。

ここに画像の説明を入力してください


2

バックトレースは大いに役立ちました、ありがとう!。最近同じ問題が発生し始めました。スローしていたmp3ファイルには有効なID3タグがなく、Tagrなどのアプリで実行すると、修正されました。


1
ID3タグで欠落しているフィールドを設定した後、アプリはAVAudioPlayerの初期化で停止しなくなりましたが、それでも再生命令で停止しました...
ReinhardMännerOct

どのフィールドが必須でしたか?それらすべて?
レッジャン

@Reggian覚えていません。申し訳ありません!欠けていたフィールドを追加する必要があることを覚えていません。正しく覚えていれば、タグのサニタイザーで実行するだけで十分です。
yo.ian.g 2016年

2

Xcode 9.2では、特定の例外を確認した後、それらを無効にすることができます。ブレークポイントメニューを開き、クリックして無効にします(色あせた矢印)

ここに画像の説明を入力してください


-4

AVAudioPlayerをクラス変数として設定してみてください!


1
私の場合、すでにAVAudioPlayerをクラス変数として設定しましたが、それでも機能しません。ソリューションを本当に知らなかったようです
Alex Cio
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.