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

108

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 à tout endroit près 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 passé 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 il s'arrête au point d'arrêt. C'était le résultat:

(lldb) bt
* thread # 1: tid = 0x1c03, 0x30df1724 libc ++ abi.dylib`__cxa_throw, raison de l'arrêt = point d'arrêt 1.2
    cadre n ° 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
    cadre n ° 2: 0x36403b0e AudioToolbox`ID3ParserOpen + 142
    image n ° 3: 0x3635bd16 AudioToolbox`MPEGAudioFile :: ParseID3Tags () + 58
    image n ° 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 n ° 6: 0x36316480 AudioToolbox`AudioFileOpenWithCallbacks + 612
    image n ° 7: 0x31f4c1ec AVFoundation`- [AVAudioPlayer 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 n'utilise que 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 ++.

ThomasCle
la source
2
J'ai eu la même trace de pile. La désactivation du point d'arrêt «Toutes les exceptions» m'a empêché de le faire.
makdad

Réponses:

175

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

Certaines classes d'AudioToolbox lancent des exceptions C ++ régulières. Vous pouvez les filtrer de cette façon.

Mugunth
la source
6
Comme j'ai écrit la section "SOLUTION" dans ma question, je ne considère pas cela comme une solution. Le AVAudioPlayerne devrait pas lancer d'exceptions aléatoires.
ThomasCle
10
"AVAudioPlayer ne devrait pas lancer d'exceptions aléatoires" - Ce n'est pas entre nos mains. C'est ainsi que le cadre est écrit et vous devez vivre avec. Cependant, je suis d'accord que ce n'est pas une bonne idée
Mugunth
@Mugunth Cela signifie-t-il que le framework répond et corrige les erreurs internes? Connaissez-vous d'autres documents à ce sujet? Je ne trouve pas grand-chose en ligne, ce qui me suggère que cela peut être dû à une erreur de programmeur ...
Remover
21

AVAudioPlayer et AVAudioRecorder lancent 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: Tout, Pause: Au lancer), vous attraperez ces exceptions. Si vous continuez l'exécution sur ces derniers, l'application continuera à 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 point d'arrêt dans le navigateur de point d'arrêt, en désactivant ce point d'arrêt particulier et en l'exécutant avec lui désactivé.

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

Edit: mettre sur "exceptions Objective-C" est évidemment comment le faire. Voir la réponse ci-dessus!

Kalle
la source
9

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

  1. Accédez au navigateur Breakpoint dans Xcode.
  2. Contrôle-cliquez sur la ligne «Toutes les exceptions».
  3. Sélectionnez l'option "Modifier le point d'arrêt ...".
  4. Changez le Exceptionde Allà Objective-C.

entrez la description de l'image ici

Stewart Macdonald
la source
2

La trace a beaucoup aidé, merci !. Nous avions commencé à rencontrer le même problème récemment. Il s'avère que les fichiers mp3 sur lesquels il était lancé n'avaient pas de balise ID3 valide et les exécuter via une application telle que Tagr les a corrigés!

yo.ian.g
la source
1
Après avoir défini les champs manquants dans la balise ID3, l'application ne s'est plus arrêtée à l'initialisation de l'AVAudioPlayer, mais elle s'est toujours arrêtée à l'instruction de lecture ...
Reinhard Männer
Quels champs étaient obligatoires? Tous?
reggian
@Reggian Je ne me souviens pas, c'était il y a si longtemps. Désolé pour ça! Je ne me souviens pas avoir besoin d'ajouter des champs manquants, il suffisait de le faire passer dans un désinfectant pour balises si je me souviens bien!
yo.ian.g
2

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

entrez la description de l'image ici

quantumpotato
la source
-4

Essayez de définir AVAudioPlayer comme variable de classe!

redestructa
la source
1
Dans mon cas, j'ai déjà configuré AVAudioPlayer en tant que variable de classe et cela ne fonctionne toujours pas. On dirait que vous ne connaissiez pas vraiment la solution
Alex Cio