AVAudioPlayer lança ponto de interrupção no modo de depuração

108

Sempre que carrego o aplicativo, ele para como se eu tivesse definido um ponto de interrupção nesta linha:

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

Não há ponto de interrupção acima ou em qualquer lugar próximo a esta linha. Isso só acontece quando eu executo o aplicativo no modo de depuração e nada trava após o ponto de interrupção. O aplicativo funciona como se nada acontecesse quando clico em "Continuar a execução do programa".

Este é o método loadData, que é chamado com initWithData:

-(NSData*)loadData:(NSString*)fileName
{
    NSString *dataPath = [self.path stringByAppendingPathComponent:fileName];
    dataPath = [dataPath stringByStandardizingPath];
    NSData *data = [[[NSData alloc] initWithContentsOfFile:dataPath]autorelease ];
    return data;
}

A função loadData parece estar funcionando bem. O arquivo mp3 solicitado é carregado e reproduzido sem problemas após o ponto de interrupção.

Você tem alguma ideia do que estou fazendo de errado?

EDIT: Eu executei um backtrace quando ele para no ponto de interrupção. Este foi o resultado:

(lldb) bt
* thread # 1: tid = 0x1c03, 0x30df1724 libc ++ abi.dylib`__cxa_throw, motivo de parada = ponto de interrupção 1.2
    frame # 0: 0x30df1724 libc ++ abi.dylib`__cxa_throw
    frame # 1: 0x36403a24 AudioToolbox`ID3ParserHandle :: ID3ParserHandle (vazio *, longo (*) (vazio *, longo sem sinal, longo sem sinal, longo sem sinal, vazio **, longo sem sinal *)) + 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: erro:] + 120

"SOLUÇÃO": Acontece que, se eu desabilitar o ponto de interrupção de exceção para todas as exceções e usar apenas o ponto de interrupção para exceções Objective-C, o problema desaparece. Mas isso não resolve o problema de que a alocação de AVAudioPlayer lança uma exceção C ++.

ThomasCle
fonte
2
Eu tive o mesmo rastreamento de pilha. Desativar o ponto de interrupção "Todas as exceções" fez com que isso não acontecesse para mim.
makdad

Respostas:

175

Adicione seu ponto de interrupção de exceção e edite o tipo de exceção de "Todas" para "Exceções Objective-C"

Algumas classes em AudioToolbox lançam exceções C ++ regulares. Você pode filtrá-los desta forma.

Mugunth
fonte
6
Como escrevi a seção "SOLUÇÃO" em minha pergunta, não considero isso uma solução. O AVAudioPlayernão deve lançar exceções aleatórias.
ThomasCle
10
"O AVAudioPlayer não deve lançar exceções aleatórias" - Isso não está em nossas mãos. É assim que o framework é escrito e você tem que conviver com isso. Porém, eu concordo que não é uma boa ideia
Mugunth
@Mugunth Isso significa que o framework está respondendo e corrigindo erros internos? Você conhece alguma outra documentação sobre ele? Não consigo encontrar muito online que me sugira que isso pode ser devido a um erro do programador ...
Removedor
21

AVAudioPlayer e AVAudioRecorder lançarão exceções, várias delas. Estes são tratados internamente pelos jogadores, mas se você tiver um ponto de interrupção para "Todos os pontos de interrupção" (ou seja, Exceção: Todos, Interrupção: Ao lançar), você capturará essas exceções. Se você continuar a execução com eles, o aplicativo continuará a funcionar normalmente e não travará.

A única solução que encontrei até agora é clicar na barra de breakpoint no Breakpoint Navigator, desabilitando esse breakpoint em particular e rodando com ele desabilitado.

Quando / se o aplicativo travar com uma exceção lançada, eu cmd-6, habilito esse ponto de interrupção, execute novamente e faço tudo o que eu fiz quando travou.

Editar: definir como "exceções Objective-C" é obviamente como fazê-lo. Veja a resposta acima!

Kalle
fonte
9

Aqui está uma captura de tela mostrando como corrigi esse erro. Não tenho certeza se esta é a mesma maneira que as respostas acima estão falando, mas presumo que seja semelhante.

  1. Vá para o navegador Breakpoint no Xcode.
  2. Clique com o botão direito do mouse na linha "Todas as exceções".
  3. Selecione a opção 'Editar Breakpoint ...'.
  4. Altere Exceptionde Allpara Objective-C.

insira a descrição da imagem aqui

Stewart Macdonald
fonte
2

O backtrace ajudou muito, obrigado !. Começamos a ter o mesmo problema recentemente. Acontece que os arquivos mp3 que ele estava jogando não tinham uma tag ID3 válida e executá-los por meio de um aplicativo como o Tagr os corrigiu imediatamente!

yo.ian.g
fonte
1
Depois de definir campos ausentes na tag ID3, o aplicativo não parava mais na inicialização do AVAudioPlayer, mas ainda parava na instrução de jogo ...
Reinhard Männer,
Quais campos são obrigatórios? Todos eles?
reggian
@Reggian não me lembro, foi há muito tempo. Me desculpe por isso! Não me lembro de precisar adicionar nenhum campo que faltava, apenas passar por um desinfetante de tags foi o suficiente, se bem me lembro!
yo.ian.g
2

No Xcode 9.2 você pode desabilitar exceções específicas depois de vê-las. Abra o menu de pontos de interrupção e clique para desativar (seta esmaecida)

insira a descrição da imagem aqui

quantumpotato
fonte
-4

Tente definir o AVAudioPlayer como uma variável de classe!

redestructa
fonte
1
No meu caso já configurei o AVAudioPlayer como uma variável de classe e ainda não funciona. Parece que você realmente não sabia a solução
Alex Cio