2012-03-13 12 views
99

Ogni volta che carico l'applicazione si ferma come se avessi impostato un punto di interruzione su questa linea:AVAudioPlayer getta punto di interruzione in modalità debug

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

Non c'è nessun punto di interruzione sopra o qualsiasi posto vicino questa linea. Succede solo quando eseguo l'app in modalità di debug e niente si blocca dopo il breakpoint. L'app funziona come se nulla fosse successo quando faccio clic su "Continua l'esecuzione del programma".

Questo è il metodo loadData, che è chiamato 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 funzione loadData sembra funzionare bene. Il file mp3 richiesto viene caricato e riprodotto senza problemi dopo il breakpoint.

Hai idea di cosa sto facendo male?

MODIFICA: Ho eseguito un backtrace quando si ferma al punto di interruzione. Questo è stato l'output:

 
(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 

"soluzione": Si scopre, se disattivo punto di interruzione eccezione per tutte le eccezioni e utilizzare solo punto di interruzione per le eccezioni Objective-C il problema scompare. Ma non risolve il problema che l'assegnazione di AVAudioPlayer genera un'eccezione C++.

+1

ho avuto la stessa analisi dello stack. Disabilitare il punto di interruzione "Tutte le eccezioni" non ha funzionato per me. – makdad

risposta

159

Aggiungi il tuo punto di interruzione eccezione e modificare il tipo di eccezione da "tutto" per "eccezioni Objective-C"

Alcune classi in AudioToolbox lanciano regolari eccezioni C++. Puoi filtrarli in questo modo.

+4

Come ho scritto la sezione "SOLUZIONE" nella mia domanda, non la considero una soluzione. 'AVAudioPlayer' non dovrebbe generare eccezioni casuali. –

+10

"AVAudioPlayer non dovrebbe lanciare eccezioni casuali" - Questo non è nelle nostre mani. Questo è il modo in cui è scritto il framework e devi conviverci. Tuttavia, sono d'accordo sul fatto che non sia una buona idea – Mugunth

+0

@Mugunth Questo significa che il framework sta rispondendo e correggendo gli errori interni? Sei a conoscenza di qualsiasi altra documentazione su di esso? Non riesco a trovare molto online che mi suggerisca che questo potrebbe essere dovuto all'errore del programmatore ... – Remover

20

AVAudioPlayer e AVAudioRecorder generano entrambe eccezioni, molte delle quali. Questi sono gestite internamente dai giocatori, ma se si dispone di un punto di interruzione per "Tutti i punti di interruzione" (vale a dire eccezione: Tutti, Break: Sul tiro) si cattura queste eccezioni. Se continui con l'esecuzione su questi, l'applicazione continuerà a funzionare normalmente e non si bloccherà affatto.

L'unica soluzione che ho escogitato finora è quella di fare clic sulla barra del punto di interruzione nel Breakpoint Navigator, disabilitare questo particolare punto di interruzione e utilizzarlo con esso disabilitato.

Quando/se l'app si arresta mai in modo anomalo con un'eccezione generata, I cmd-6, abilita quel punto di interruzione, ed esegue di nuovo e fa qualsiasi cosa abbia fatto quando si è arrestato in modo anomalo.

Modifica: l'impostazione su "Eccezioni C-Objective" è ovviamente come farlo. Vedi sopra la risposta!

2

Il backtrace ha aiutato molto, grazie !. Abbiamo iniziato a imbattersi nello stesso problema di recente. Si scopre che i file mp3 che stava lanciando non avevano un tag ID3 valido e li eseguiva tramite un'app come Tagr risolti subito!

+1

Dopo aver impostato i campi mancanti nel tag ID3, l'app non si è più fermata all'avvio di AVAudioPlayer, ma si è fermato a le istruzioni di gioco ... –

+0

Quali campi sono stati richiesti? Tutti loro? – Reggian

+0

@Reggian Non ricordo, è stato tanto tempo fa. Mi dispiace per quello! Non ricordo di aver bisogno di aggiungere alcun campo che mancava, bastava eseguirlo con un tag disinfettante se non ricordo male! –

-4

Provare ad impostare AVAudioPlayer come variabile di classe!

+1

Nel mio caso ho già impostato AVAudioPlayer come variabile di classe e ancora non funziona. Sembra che tu non abbia realmente conosciuto la soluzione –

4

Ecco uno screenshot che mostra come ho risolto questo errore. Non sono sicuro se questo è lo stesso modo in cui le risposte di cui sopra stanno parlando, ma presumo che sia simile.

  1. Passare al navigatore di Breakpoint in Xcode.
  2. Fare clic tenendo premuto il tasto Controllo sulla riga "Tutte le eccezioni".
  3. Selezionare l'opzione "Modifica punto di interruzione ...".
  4. Modificare Exception da All a Objective-C.

enter image description here

1

In Xcode 9.2 è possibile disattivare eccezioni specifiche dopo averli visti. Aprire punti di interruzione di menu e fare clic per disattivare (freccia sbiadito)

enter image description here

Problemi correlati