AVAudioPlayer genera il punto di interruzione in modalità di debug


108

Ogni volta che carico l'app si ferma come se avessi impostato un breakpoint su questa riga:

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

Non ci sono punti di interruzione sopra o in qualsiasi punto vicino a questa linea. Succede solo quando eseguo l'app in modalità debug e nulla si arresta in modo anomalo dopo il punto di interruzione. L'app funziona come se non fosse successo nulla quando clicco su "Continua l'esecuzione del programma".

Questo è il metodo loadData, che viene 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 correttamente. Il file mp3 richiesto viene caricato e riprodotto senza problemi dopo il punto di interruzione.

Hai idea di cosa sto sbagliando?

MODIFICARE: 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, motivo di interruzione = punto di interruzione 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: errore:] + 120

"SOLUZIONE": Si scopre che se disabilito il punto di interruzione dell'eccezione per tutte le eccezioni e utilizzo solo il punto di interruzione per le eccezioni Objective-C, il problema scompare. Ma non risolve il problema che l'allocazione di AVAudioPlayer genera un'eccezione C ++.


2
Ho avuto la stessa traccia dello stack. Disattivando il punto di interruzione "Tutte le eccezioni" non è stato possibile.
makdad

Risposte:


175

Aggiungi il punto di interruzione dell'eccezione e modifica il tipo di eccezione da "Tutto" a "Eccezioni Objective-C"

Alcune classi in AudioToolbox generano normali eccezioni C ++. Puoi filtrarli in questo modo.


6
Poiché ho scritto la sezione "SOLUZIONE" nella mia domanda, non la considero una soluzione. Non AVAudioPlayerdovrebbe generare eccezioni casuali.
ThomasCle

10
"AVAudioPlayer non dovrebbe generare eccezioni casuali" - Questo non è nelle nostre mani. È così che è scritta la struttura e devi conviverci. Tuttavia, sono d'accordo che non sia una buona idea
Mugunth,

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

21

AVAudioPlayer e AVAudioRecorder genereranno entrambi eccezioni, molte delle quali. Questi sono gestiti internamente dai giocatori, ma se hai un breakpoint per "All Breakpoints" (es. Eccezione: All, Break: On Throw) catturerai queste eccezioni. Se continui a eseguirli, l'app continuerà a funzionare normalmente e non si bloccherà affatto.

L'unica soluzione che ho trovato finora è fare clic sulla barra dei punti di interruzione nel Navigatore punti di interruzione, disabilitare questo particolare punto di interruzione e eseguirlo con esso disabilitato.

Quando / se l'app si arresta in modo anomalo con un'eccezione generata, cmd-6, abilito quel punto di interruzione, eseguo nuovamente e faccio tutto ciò che ho fatto quando si è bloccato.

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


9

Ecco uno screenshot che mostra come ho corretto questo errore. Non sono sicuro che sia lo stesso modo di cui parlano le risposte precedenti, ma presumo sia simile.

  1. Vai al navigatore Breakpoint in Xcode.
  2. Fai clic tenendo premuto il tasto Ctrl sulla riga "Tutte le eccezioni".
  3. Seleziona l'opzione "Modifica punto di interruzione ...".
  4. Cambia il Exceptionda Alla Objective-C.

inserisci qui la descrizione dell'immagine


2

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


1
Dopo aver impostato i campi mancanti nel tag ID3, l'app non si è più interrotta durante l'inizializzazione di AVAudioPlayer, ma si è comunque interrotta alle istruzioni di riproduzione ...
Reinhard Männer

Quali campi erano obbligatori? Tutti loro?
reggian

@Reggian non ricordo, è stato tanto tempo fa. Mi dispiace per quello! Non ricordo di aver bisogno di aggiungere alcun campo che mancasse, è stato sufficiente eseguirlo tramite un disinfettante per tag se ricordo bene!
yo.ian.g

2

In Xcode 9.2 puoi disabilitare eccezioni specifiche dopo averle viste. Aprire il menu dei punti di interruzione e fare clic per disabilitare (freccia sbiadita)

inserisci qui la descrizione dell'immagine


-4

Prova a 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 conoscessi davvero la soluzione
Alex Cio
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.