2012-03-13 27 views
99

Cada vez que se carga la aplicación se detiene como si hubiera establecido un punto de interrupción en esta línea:AVAudioPlayer lanza punto de interrupción en modo de depuración

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

No hay punto de interrupción anteriormente o cualquier lugar cerca de esta línea. Solo sucede cuando ejecuto la aplicación en modo de depuración y nada falla después del punto de interrupción. La aplicación funciona como si nada hubiera sucedido cuando hago clic en "Continuar ejecución del programa".

Este es el método loadData, que se llama con initWithData:

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

La función loadData parece estar funcionando bien. El archivo mp3 solicitado se carga y reproduce sin problemas después del punto de interrupción.

¿Tiene alguna idea de lo que estoy haciendo mal?

EDIT: me pasó una traza inversa cuando se detiene en el punto de interrupción. Este fue el resultado:

 
(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 

"solución": Resulta que, si inhabilito punto de interrupción de excepción para todas las excepciones y sólo utilizo punto de interrupción para las excepciones de Objective-C el problema desaparece. Pero no resuelve el problema de que la asignación de AVAudioPlayer arroja una excepción de C++.

+1

que tenían la misma traza de la pila. Desactivar el punto de interrupción "Todas las excepciones" hizo que no sucediera para mí. – makdad

Respuesta

159

Haz tu punto de interrupción excepción y editar el tipo de excepción de "Todos" a "excepciones de Objective-C"

Algunas clases en AudioToolbox lanzan excepciones regulares C++. Puede filtrarlos de esta manera.

+4

Como escribí la sección "SOLUCIÓN" en mi pregunta, no considero esto como una solución. El 'AVAudioPlayer' no debe arrojar excepciones aleatorias. –

+10

"AVAudioPlayer no debe arrojar excepciones aleatorias" - Esto no está en nuestras manos. Esa es la forma en que se escribe el marco y tienes que vivir con eso. Sin embargo, estoy de acuerdo en que no es una buena idea – Mugunth

+0

@Mugunth ¿Significa esto que el marco responde y corrige los errores internos? ¿Conoces alguna otra documentación sobre esto? No puedo encontrar mucho en línea, lo que me sugiere que esto puede deberse a un error del programador ... – Remover

20

AVAudioPlayer y AVAudioRecorder generarán excepciones, varias de ellas. Estos son manejados internamente por los jugadores, pero si tiene un punto de quiebre para "Todos los puntos de interrupción" (es decir, Excepción: Todos, Pausa: Al lanzar), verá estas excepciones. Si continúa la ejecución en estos, la aplicación continuará ejecutándose normalmente y no se bloqueará en absoluto.

La única solución que he encontrado hasta ahora es hacer clic en la barra de punto de interrupción en el navegador de punto de interrupción, deshabilitar este punto de interrupción en particular y ejecutarlo deshabilitado.

Cuando/si la aplicación se bloquea con una excepción lanzada, I cmd-6, habilita ese punto de interrupción, y vuelve a ejecutar y hago lo que hice cuando se bloqueó.

Editar: la configuración de "Excepciones de Objective-C" es obviamente cómo hacerlo. ¡Vea la respuesta anterior!

2

El backtrace ayudó mucho, ¡gracias !. Empezamos a encontrarnos con el mismo problema recientemente. Resulta que los archivos mp3 que estaba lanzando no tenían una etiqueta ID3 válida y los ejecutaban a través de una aplicación como Tagr ¡los corrigieron!

+1

Después de configurar los campos faltantes en la etiqueta ID3, la aplicación ya no se detenía en la inicialización de AVAudioPlayer, pero todavía se detenía en la instrucción de juego ... –

+0

¿Qué campos fueron requeridos? ¿Todos ellos? – Reggian

+0

@Reggian No recuerdo, fue hace tanto tiempo. ¡Lo siento por eso! No recuerdo haber necesitado agregar ningún campo que faltara, simplemente ejecutarlo a través de un sanitizador de etiquetas fue suficiente si no recuerdo mal. –

-4

Intenta configurar el AVAudioPlayer como una variable de clase!

+1

En mi caso, ya configuré AVAudioPlayer como una variable de clase y aún no funciona. Parece que realmente no sabías la solución –

4

Aquí hay una captura de pantalla que muestra cómo he solucionado este error. No estoy seguro si esto es de la misma manera que las respuestas anteriores están hablando, pero supongo que es similar.

  1. Vaya al navegador Breakpoint en Xcode.
  2. Control-clic en la línea 'Todas las excepciones'.
  3. Seleccione la opción 'Editar punto de interrupción ...'.
  4. Cambie el Exception de All a Objective-C.

enter image description here

1

En Xcode 9.2 se puede desactivar excepciones específicas después de haberlos visto. abierto puntos de interrupción de menú y haga clic para desactivar (flecha desvanecido)

enter image description here

Cuestiones relacionadas