108 votes

AVAudioPlayer lance un point d'arrêt en mode débogage

Chaque fois que je charge l'application, elle s'arrête comme si j'avais placé un point d'arrêt sur cette ligne :

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

Il n'y a pas de point d'arrêt au-dessus ou à proximité de cette ligne. Cela ne se produit que lorsque j'exécute l'application en mode débogage et rien ne se produit après le point d'arrêt. L'application fonctionne comme si rien ne s'était passé lorsque je clique sur "Continuer l'exécution du programme".

C'est la méthode loadData, qui est appelée avec initWithData :

-(NSData*)loadData:(NSString*)fileName
{
    NSString *dataPath = [self.path stringByAppendingPathComponent:fileName];
    dataPath = [dataPath stringByStandardizingPath];
    NSData *data = [[[NSData alloc] initWithContentsOfFile:dataPath]autorelease ];
    return data;
}

La fonction loadData semble fonctionner correctement. Le fichier mp3 demandé est chargé et lu sans aucun problème après le point d'arrêt.

Vous avez une idée de ce que je fais de mal ?

EDIT : J'ai lancé un backtrace quand il s'arrête au point d'arrêt. Voici le résultat :

(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

"SOLUTION" : Il s'avère que si je désactive le point d'arrêt pour toutes les exceptions et n'utilise le point d'arrêt que pour les exceptions Objective-C, le problème disparaît. Mais cela ne résout pas le problème de l'allocation de l'AVAudioPlayer qui lève une exception C++.

175voto

Mugunth Points 8671

Ajoutez votre point d'arrêt d'exception et modifiez le type d'exception de "All" à "Objective-C exceptions".

Certaines classes d'AudioToolbox lancent des exceptions C++ normales. Vous pouvez les filtrer de cette façon.

21voto

Kalle Points 6804

AVAudioPlayer et AVAudioRecorder lèveront tous deux des exceptions, plusieurs d'entre elles. Celles-ci sont gérées en interne par les lecteurs mais si vous avez un point d'arrêt pour "Tous les points d'arrêt" (c'est-à-dire Exception : All, Break : On Throw), vous pourrez attraper ces exceptions. Si vous poursuivez l'exécution sur ces exceptions, l'application continuera à fonctionner normalement et ne se plantera pas du tout.

La seule solution que j'ai trouvée jusqu'à présent est de cliquer sur la barre de points d'arrêt dans le navigateur de points d'arrêt, de désactiver ce point d'arrêt particulier et de l'exécuter avec cette désactivation.

Si l'application se bloque avec une exception, je fais cmd-6, j'active le point d'arrêt, je réexécute et je fais ce que j'ai fait quand elle s'est bloquée.

Edit : le réglage sur "exceptions Objective-C" est évidemment la façon de faire. Voir la réponse ci-dessus !

9voto

smacdonald Points 90

Voici une capture d'écran montrant comment j'ai corrigé cette erreur. Je ne suis pas sûr que ce soit la même méthode que celle décrite dans les réponses ci-dessus, mais je suppose qu'elle est similaire.

  1. Allez dans le navigateur Breakpoint dans Xcode.
  2. Contrôlez-cliquez sur la ligne "Toutes les exceptions".
  3. Sélectionnez l'option "Edit Breakpoint...".
  4. Changez le Exception de All a Objective-C .

enter image description here

2voto

yo.ian.g Points 301

Le backtrace m'a beaucoup aidé, merci ! Nous avons commencé à rencontrer le même problème récemment. Il s'est avéré que les fichiers mp3 qu'il lançait n'avaient pas de balise ID3 valide et qu'en les exécutant avec une application telle que Tagr ça les a bien arrangés !

2voto

quantumpotato Points 2829

Dans Xcode 9.2, vous pouvez désactiver des exceptions spécifiques après les avoir vues. Ouvrez le menu des points d'arrêt et cliquez pour désactiver (flèche effacée)

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X