web-dev-qa-db-ja.com

AVAudioPlayerはデバッグモードでブレークポイントをスローします

アプリをロードするたびに、この行にブレークポイントを設定したかのように停止します。

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

上またはこの行の近くにブレークポイントはありません。デバッグモードでアプリを実行したときにのみ発生し、ブレークポイント後に何もクラッシュしません。 [プログラムの実行を続行]をクリックしても何も起こらないため、アプリは機能します。

これは、initWithDataで呼び出されるloadDataメソッドです。

-(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 
 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 
フレーム#6:0x36316480 AudioToolbox`AudioFileOpenWithCallbacks + 612 
フレーム#7:0x31f4c1ec AVFoundation`- [AVAudioプレーヤーinitWithData:error:] + 120 

"SOLUTION":すべての例外に対して例外ブレークポイントを無効にし、Objective-C例外に対してのみブレークポイントを使用すると、問題はなくなります。しかし、AVAudioPlayerの割り当てがC++例外をスローするという問題は解決しません。

103

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

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

168
Mugunth

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

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

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

編集:「Objective-C例外」への設定は、明らかにそれを行う方法です。上記の回答をご覧ください!

21
Kalle

このエラーを修正した方法を示すスクリーンショットを次に示します。これが上記の答えが話しているのと同じ方法であるかどうかはわかりませんが、私はそれが似ていると思います。

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

enter image description here

6

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

2
yo.ian.g

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

enter image description here

1
quantumpotato