2012-03-13 5 views
99

Каждый раз, когда я загрузить приложение он останавливается, как если бы я поставил точку останова на этой линии:AVAudioPlayer бросает точку останова в режиме отладки

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 
* thread #1: tid = 0x1c03, 0x30df1724 libc++abi.dylib`__cxa_throw, stop reason = breakpoint 1.2 
    frame #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 
    frame #6: 0x36316480 AudioToolbox`AudioFileOpenWithCallbacks + 612 
    frame #7: 0x31f4c1ec AVFoundation`-[AVAudioPlayer initWithData:error:] + 120 

«РЕШЕНИЕ»: Оказывается, если отключить исключение точки останова для всех исключений и использовать только точки останова для исключения Objective-C проблема исчезает. Но это не решает проблему, что выделение AVAudioPlayer вызывает исключение C++.

+1

Я была такая же трассировка стеки. Отключение контрольной точки «Все исключения» заставило меня не случиться. – makdad

ответ

159

Добавить исключение точки останова и изменить тип исключения из «всех» до «исключения Objective-C»

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

+4

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

+10

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

+0

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

20

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

Единственное решение, с которым я столкнулся, заключается в том, чтобы щелкнуть по панели точек останова в Breakpoint Navigator, отключив эту точную точку останова и работая с ней отключенной.

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

Редактирование: установка на «Objective-C exceptions», очевидно, как это сделать. См. Выше ответ!

2

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

+1

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

+0

Какие поля были необходимы? Все они? – Reggian

+0

@Reggian Я не помню, это было так давно. Извини за это! Я не помню, чтобы добавлять какие-либо поля, которые отсутствовали, просто запустить его через дезинфицирующее средство для тегов было достаточно, если я правильно помню! –

-4

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

+1

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

4

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

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

enter image description here

1

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

enter image description here

Смежные вопросы