2012-03-21 14 views
12

Estoy ejecutando un programa de iOS en los simuladores 4.3.2, 5.0 y 5.1, y toco una extraña excepción interna en AudioToolbox. Tengo un punto de interrupción establecido en Xcode (Xcode 4.3.1, que se ejecuta en 10.7.3) para todas las excepciones y el depurador está rompiendo durante una llamada para AudioServicesCreateSystemSoundID():¿Por qué AudioServicesCreateSystemSoundID lanza una excepción internamente pero devuelve 0 como un código de error?

SystemSoundID soundID; 
OSStatus errorCode = AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID); 
        //^boom.^

El trazado inverso:

(lldb) bt 
* thread #1: tid = 0x1f03, 0x9000e230 libc++abi.dylib`__cxa_throw, stop reason = breakpoint 1.2 
frame #0: 0x9000e230 libc++abi.dylib`__cxa_throw 
frame #1: 0x00144193 AudioToolbox`ID3ParserHandle::ID3ParserHandle(void*, long (*)(void*, unsigned long, unsigned long, unsigned long, void**, unsigned long*)) + 259 
frame #2: 0x001442de AudioToolbox`ID3ParserOpen + 62 
frame #3: 0x0006c0e7 AudioToolbox`MPEGAudioFile::ParseID3Tags() + 87 
frame #4: 0x0006c2ba AudioToolbox`MPEGAudioFile::ParseAudioFile() + 26 
frame #5: 0x00015153 AudioToolbox`AudioFileOpenWithCallbacks + 371 
frame #6: 0x00027020 AudioToolbox`_ZL15VerifyAndMapURLPK7__CFURLRx + 448 
frame #7: 0x00026d85 AudioToolbox`_ZL18ActionDataToServerPK7__CFURLm + 933 
frame #8: 0x000da26b AudioToolbox`AudioServicesCreateSystemSoundID + 235 
frame #9: 0x00005be1 app`-[SoundsViewController playSoundForPath:] + 257 at SoundsViewController.m:161 
frame #10: 0x00005a99 app`-[SoundsViewController tableView:didSelectRowAtIndexPath:] + 777 at SoundsViewController.m:129 
frame #11: 0x0029db68 UIKit`-[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1140 
frame #12: 0x00293b05 UIKit`-[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 219 
frame #13: 0x009ad79e Foundation`__NSFireDelayedPerform + 441 
frame #14: 0x00fb58c3 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19 
frame #15: 0x00fb6e74 CoreFoundation`__CFRunLoopDoTimer + 1220 
frame #16: 0x00f132c9 CoreFoundation`__CFRunLoopRun + 1817 
frame #17: 0x00f12840 CoreFoundation`CFRunLoopRunSpecific + 208 
frame #18: 0x00f12761 CoreFoundation`CFRunLoopRunInMode + 97 
frame #19: 0x01f6b1c4 GraphicsServices`GSEventRunModal + 217 
frame #20: 0x01f6b289 GraphicsServices`GSEventRun + 115 
frame #21: 0x00234c93 UIKit`UIApplicationMain + 1160 
frame #22: 0x00002c45 app`main + 181 at main.m:14 

Sin embargo, el archivo de audio en soundID se crea correctamente, y el código de error que OSStatus AudioServicesCreateSystemSoundID retornos es 0.

Esto sucede en las tres versiones simulador de iOS he instalado y funcionando en mi iPhone 5.1.

Esto parece ser el mismo backtrace general como AVAudioPlayer throws breakpoint in debug mode, aunque el mío es el resultado de una invocación más directa de AudioToolbox.

Quiero archivar esto con Apple, ya que es un error en AudioToolbox (los marcos no deben usar excepciones para control de flujo, por bbum y otros), pero antes de hacerlo, me pregunto qué otra información puedo recopilar para darles, y si hay alguna manera de evitar este lanzamiento (tal vez retocando las etiquetas ID3 en este mp3?)

+0

Obtengo una excepción en el método ExtAudioFileSetProperty de AudioToolbox también. No he encontrado una forma de evitar las excepciones, desafortunadamente. –

+0

Sí, parece que solo están usando una tonelada de excepciones internamente para el flujo de control. La mejor solución es no agregar manualmente todos los lanzamientos de excepción como un punto de interrupción, y en su lugar usar su punto de interrupción "punto de corte de excepción". – cbowns

+0

Parece ser un error de Simulator. Cuando ejecuto la aplicación en mi iPhone, no se bloquea. – 0xa6a

Respuesta

3

Las librerías C++ pueden arrojar y atrapar excepciones internamente por todo tipo de razones, por ejemplo, final del búfer o final de archivo. Si esto es un uso apropiado de excepciones, un buen estilo de codificación o una práctica de ingeniería de software es discutible. Siempre que una excepción no lo atrape en su código, no debe preocuparse por ello.

Usted dice que la rutina regresa con éxito y se obtiene el resultado deseado, por lo que nada está mal (es decir, no es un error).

+0

De acuerdo. En general, he dejado de establecer el punto de interrupción "todas las excepciones", ya que una gran cantidad de bibliotecas de C++ lo utilizan para el flujo de control. – cbowns

6

Nos topamos con una excepción en el mismo lugar, resultó que los archivos mp3 en los que se estaba produciendo no tenían etiquetas ID3 válidas, ejecutándolos a través de una aplicación como Tagr que los repararon.

+0

Hace tiempo que dejé de trabajar en el proyecto, pero es genial saberlo. Gracias por la info! – cbowns

+0

Para pequeños lotes de archivos de audio con etiquetas no válidas, considere la aplicación freemium OSX [Music Tag] (http://www.wideanglesoftware.com/musictag/) en lugar de pagar por Tagr. – AWrightIV

Cuestiones relacionadas