1. ホーム
  2. ios

[解決済み] AVAudioPlayerがデバッグモードでブレークポイントを投げる

2022-10-12 16:55:36

質問

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

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ファイルは、ブレークポイントの後、問題なくロードされ、再生されます。

何が間違っているのか、何か心当たりはありますか?

EDITです。 ブレークポイントで停止したときにバックトレースを実行してみました。これが出力されました。

(lldb) bt
* スレッド #1: tid = 0x1c03, 0x30df1724 libc++abi.dylib`__cxa_throw, stop reason = breakpoint 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
    フレーム#2: 0x36403b0e AudioToolbox`ID3ParserOpen + 142
    フレーム#3: 0x3635bd16 AudioToolbox`MPEGAudioFile::ParseID3Tags() + 58
    フレーム番号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 long, void*)) + 166
    フレーム番号6:0x36316480 AudioToolbox`AudioFileOpenWithCallbacks + 612
    フレーム#7: 0x31f4c1ec AVFoundation`-[AVAudioPlayer initWithData:error:] + 120

解決方法。 すべての例外に対して例外ブレークポイントを無効にし、Objective-Cの例外に対してのみブレークポイントを使用すれば、問題はなくなることが判明しました。しかし、AVAudioPlayer の割り当てが C++ 例外を投げるという問題は解決されません。

どのように解決するのですか?

例外ブレークポイントを追加し、例外の種類を "All" から "Objective-C exceptions" に編集します。

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