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
У меня была такая же трассировка стека. Отключение точки останова «Все исключения» не помогло мне.
makdad

Ответы:


175

Добавьте точку останова на исключение и измените тип исключения с "Все" на "Исключения цели-C"

Некоторые классы в AudioToolbox выдают обычные исключения C ++. Вы можете отфильтровать их таким образом.


6
Поскольку я написал раздел «РЕШЕНИЕ» в своем вопросе, я не считаю это решением. Не AVAudioPlayerдолжно вызывать случайных исключений.
ThomasCle

10
«AVAudioPlayer не должен генерировать случайные исключения» - это не в наших руках. Так написан фреймворк, и с этим нужно жить. Хотя, я согласен, что это
плохая

@Mugunth Означает ли это, что фреймворк реагирует на внутренние ошибки и исправляет их? Знаете ли вы о какой-либо другой документации по нему? Я не могу найти много в Интернете, что наводит на мысль, что это может быть связано с ошибкой программиста ...
Remover

21

AVAudioPlayer и AVAudioRecorder выдают исключения, некоторые из них. Они обрабатываются внутри игроков, но если у вас есть точка останова для «Все точки останова» (например, Exception: All, Break: On Throw), вы поймаете эти исключения. Если вы продолжите выполнение на них, приложение продолжит работать в обычном режиме и вообще не выйдет из строя.

Единственное решение, которое я придумал до сих пор, - это щелкнуть панель точки останова в навигаторе точек останова, отключить эту конкретную точку останова и запустить ее с отключенной.

Когда / если приложение когда-либо вылетает из-за возникшего исключения, я нажимаю cmd-6, включаю эту точку останова, перезапускаю и делаю все, что я делал, когда оно упало.

Изменить: настройка «Исключения Objective-C», очевидно, как это сделать. См. Ответ выше!


9

Вот скриншот, показывающий, как я исправил эту ошибку. Я не уверен, что это то же самое, о чем говорится в ответах выше, но я предполагаю, что это похоже.

  1. Перейдите в навигатор точек останова в Xcode.
  2. Удерживая клавишу Control, щелкните строку «Все исключения».
  3. Выберите параметр «Изменить точку останова ...».
  4. Измените Exceptionс Allна Objective-C.

введите описание изображения здесь


2

Обратная трассировка очень помогла, спасибо !. Недавно мы начали сталкиваться с той же проблемой. Оказывается, в mp3-файлах, которые он перебрасывал, не было действительного тега ID3, и запуск их через приложение, такое как Tagr, исправил их!


1
После установки отсутствующих полей в теге ID3 приложение больше не останавливалось на инициализации AVAudioPlayer, но все равно останавливалось на инструкции воспроизведения ...
Рейнхард Меннер

Какие поля были обязательными? Все они?
reggian 02

@Reggian Я не помню, это было так давно. Извини за это! Я не помню, чтобы мне нужно было добавлять какие-либо поля, которые отсутствовали, достаточно было просто пропустить его через средство очистки тегов, если я правильно помню!
yo.ian.g 04

2

В Xcode 9.2 вы можете отключить определенные исключения после их просмотра. Откройте меню точек останова и нажмите, чтобы отключить (блеклая стрелка)

введите описание изображения здесь


-4

Попробуйте установить AVAudioPlayer как переменную класса!


1
В моем случае я уже настроил AVAudioPlayer как переменную класса, но он по-прежнему не работает. Похоже, вы действительно не знали решения
Алекс Чио
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.