2012-03-21 6 views
12

Sto eseguendo un programma iOS nei simulatori 4.3.2, 5.0 e 5.1 e sto colpendo una strana eccezione interna in AudioToolbox. Ho un punto di interruzione impostato in Xcode (Xcode 4.3.1, in esecuzione su 10.7.3) per tutte le eccezioni, e il debugger è rottura durante una chiamata per AudioServicesCreateSystemSoundID():Perché AudioServicesCreateSystemSoundID genera un'eccezione internamente ma restituisce 0 come codice di errore?

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

Il backtrace:

(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 

Tuttavia, il file audio in soundID viene creato correttamente, e il codice di errore OSStatus che AudioServicesCreateSystemSoundID rendimenti è 0.

Questo accade in tutte e tre le versioni iOS Simulator ho installato, e sul mio iPhone in esecuzione 5.1.

Questo sembra essere lo stesso backtrace generale di AVAudioPlayer throws breakpoint in debug mode, sebbene il mio sia il risultato di un'invocazione più diretta di AudioToolbox.

Voglio archiviarlo con Apple, poiché si tratta di un bug in AudioToolbox (i framework non dovrebbero usare eccezioni per il controllo del flusso, per bbum e altri), ma prima di farlo, mi chiedo quali altre informazioni posso raccogliere per dare loro, e se c'è qualche modo per evitare questo lancio (magari modificando i tag ID3 in questo mp3?)

+0

Ricevo un'eccezione generata anche nel metodo ExtAudioFileSetProperty di AudioToolbox. Purtroppo non ho trovato un modo per evitare le eccezioni. –

+0

Sì, sembra che stiano usando solo un sacco di eccezioni internamente per il controllo del flusso. La soluzione migliore consiste nel non aggiungere manualmente tutti i lanci di eccezioni come punto di interruzione e utilizzare invece il punto di interruzione "Punto di interruzione eccezione". – cbowns

+0

Sembra un bug di Simulator. Quando eseguo l'app sul mio iPhone, non si arresterà in modo anomalo. – 0xa6a

risposta

3

Le librerie C++ possono lanciare e intercettare eccezioni internamente per tutti i tipi di motivi, ad esempio fine del buffer o fine di file. Se questo è un uso appropriato delle eccezioni, uno stile di codifica buono o una pratica di ingegneria del software è discutibile. Finché un'eccezione non lo rende non incluso nel codice, non dovresti preoccupartene.

Si dice che la routine ritorna con successo e si ottiene l'output desiderato, quindi niente è sbagliato (cioè non è un bug).

+0

concordato. In genere ho smesso di impostare il punto di interruzione "tutte le eccezioni", poiché molte librerie C++ lo usano per il controllo del flusso. – cbowns

6

Stavamo eseguendo un'eccezione nello stesso posto, si è scoperto che i file mp3 su cui si stava verificando non avevano tag ID3 validi, eseguendoli tramite un'app come Tagr risolti.

+0

Ho smesso da tempo di lavorare sul progetto, ma è bello saperlo. Grazie per le informazioni! – cbowns

+0

Per piccoli batch di file audio con tag non validi, considerare l'applicazione OSX freemium [Music Tag] (http://www.wideanglesoftware.com/musictag/) anziché pagare per Tagr. – AWrightIV

Problemi correlati