web-dev-qa-db-fra.com

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 défini 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 que rien ne se bloque après le point d'arrêt. L'application fonctionne car rien ne s'est produit lorsque je clique sur "Continuer l'exécution du programme".

Il s'agit de 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.

Avez-vous une idée de ce que je fais mal?

EDIT: J'ai exécuté une trace arrière quand elle s'arrête au point d'arrêt. C'était la sortie:

 (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 
 Image # 2: 0x36403b0e AudioToolbox`ID3ParserOpen + 142 
 Image # 3: 0x3635bd16 AudioToolbox`MPEGAudioFile :: ParseID3Tags () + 58 
 Image # 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 
 image # 6: 0x36316480 AudioToolbox`AudioFileOpenWithCallbacks + 612 
 image # 7: 0x31f4c1ec AVFoundation`- [AVAudio Player initWithData: erreur:] + 120 

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

103
Thomas Clemensen

Ajoutez votre point d'arrêt d'exception et modifiez le type d'exception de "Tous" à "Exceptions Objective-C"

Certaines classes dans AudioToolbox lèvent des exceptions C++ régulières. Vous pouvez les filtrer de cette façon.

168
Mugunth

AVAudioPlayer et AVAudioRecorder lèveront tous deux des exceptions, plusieurs d'entre elles. Celles-ci sont gérées en interne par les joueurs mais si vous avez un point d'arrêt pour "Tous les points d'arrêt" (c'est-à-dire Exception: Tous, Break: Au lancement), vous intercepterez ces exceptions. Si vous continuez l'exécution sur ces derniers, l'application continuera de fonctionner normalement et ne 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 désactivé.

Lorsque/si l'application se bloque avec une exception levée, je cmd-6, active ce point d'arrêt, puis réexécute et fais ce que j'ai fait quand il s'est écrasé.

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

21
Kalle

Voici une capture d'écran montrant comment j'ai résolu cette erreur. Je ne sais pas si c'est de la même manière que les réponses ci-dessus parlent, mais je suppose que c'est similaire.

  1. Accédez au navigateur Breakpoint dans Xcode.
  2. Cliquez avec le bouton droit de la souris sur la ligne "Toutes les exceptions".
  3. Sélectionnez l'option "Modifier le point d'arrêt ...".
  4. Modifiez le Exception de All en Objective-C.

enter image description here

6
Stewart Macdonald

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

2
yo.ian.g

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 fanée)

enter image description here

1
quantumpotato