AVAudioPlayer lanza un punto de interrupción en modo de depuración

108

Cada vez que cargo la aplicación, se detiene como si hubiera establecido un punto de interrupción en esta línea:

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

No hay ningún punto de interrupción arriba ni ningún 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 sucediera 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.

¿Tienes idea de lo que estoy haciendo mal?

EDITAR: Ejecuté un seguimiento cuando se detiene en el punto de interrupción. Este fue el resultado:

(lldb) bt
* hilo # 1: tid = 0x1c03, 0x30df1724 libc ++ abi.dylib`__cxa_throw, motivo de parada = punto de interrupción 1.2
    marco # 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
    marco # 2: 0x36403b0e AudioToolbox`ID3ParserOpen + 142
    marco # 3: 0x3635bd16 AudioToolbox`MPEGAudioFile :: ParseID3Tags () + 58
    fotograma # 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
    marco # 6: 0x36316480 AudioToolbox`AudioFileOpenWithCallbacks + 612
    fotograma # 7: 0x31f4c1ec AVFoundation`- [AVAudioPlayer initWithData: error:] + 120

"SOLUCIÓN": Resulta que si desactivo el punto de interrupción de excepciones para todas las excepciones y solo uso el 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 ++.

ThomasCle
fuente
2
Tuve el mismo rastro de pila. Desactivar el punto de interrupción "Todas las excepciones" hizo que no me sucediera.
makdad

Respuestas:

175

Agregue su punto de interrupción de excepción y edite el tipo de excepción de "Todas" a "Excepciones de Objective-C"

Algunas clases de AudioToolbox arrojan excepciones habituales de C ++. Puede filtrarlos de esta manera.

Mugunth
fuente
6
Como he escrito la sección "SOLUCIÓN" en mi pregunta, no considero esto como una solución. No AVAudioPlayerdebería lanzar excepciones aleatorias.
ThomasCle
10
"AVAudioPlayer no debería lanzar excepciones aleatorias" - Esto no está en nuestras manos. Esa es la forma en que está escrito el marco y tienes que vivir con él. Sin embargo, estoy de acuerdo en que no es una buena idea
Mugunth
@Mugunth ¿Esto significa que el marco está respondiendo y corrigiendo errores internos? ¿Conoce alguna otra documentación al respecto? No puedo encontrar mucho en línea, lo que me sugiere que esto puede deberse a un error del programador ...
Remover
21

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

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

Cuando / si la aplicación falla alguna vez con una excepción lanzada, hago cmd-6, habilito ese punto de interrupción y vuelvo a ejecutar y hago lo que hice cuando se bloqueó.

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

Kalle
fuente
9

Aquí hay una captura de pantalla que muestra cómo solucioné este error. No estoy seguro de si esta es la misma forma en que se refieren las respuestas anteriores, 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 Exceptionde Alla Objective-C.

ingrese la descripción de la imagen aquí

Stewart Macdonald
fuente
2

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

yo.ian.g
fuente
1
Después de configurar los campos faltantes en la etiqueta ID3, la aplicación ya no se detuvo en la inicialización de AVAudioPlayer, pero aún se detuvo en la instrucción de reproducción ...
Reinhard Männer
¿Qué campos eran obligatorios? ¿Todos ellos?
Reggian
@Reggian No recuerdo, fue hace tanto tiempo. ¡Lo siento por eso! No recuerdo haber necesitado agregar ningún campo que faltaba, ¡solo ejecutarlo a través de un desinfectante de etiquetas fue suficiente si recuerdo correctamente!
yo.ian.g
2

En Xcode 9.2 puede deshabilitar excepciones específicas después de haberlas visto. Abra el menú de puntos de interrupción y haga clic para desactivar (flecha difuminada)

ingrese la descripción de la imagen aquí

patata
fuente
-4

¡Intente configurar AVAudioPlayer como una variable de clase!

redestructa
fuente
1
En mi caso, ya configuré AVAudioPlayer como una variable de clase y todavía no funciona. Parece que realmente no conocías la solución
Alex Cio