AVAudioPlayer löst im Debug-Modus einen Haltepunkt aus

108

Jedes Mal, wenn ich die App lade, stoppt sie, als hätte ich einen Haltepunkt in dieser Zeile festgelegt:

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

Es gibt keinen Haltepunkt über oder irgendwo in der Nähe dieser Linie. Es passiert nur, wenn ich die App im Debug-Modus starte und nach dem Haltepunkt nichts abstürzt. Die App funktioniert so, als wäre nichts passiert, wenn ich auf "Programmausführung fortsetzen" klicke.

Dies ist die loadData-Methode, die aufgerufen wird mit initWithData:

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

Die loadData-Funktion scheint einwandfrei zu funktionieren. Die angeforderte MP3-Datei wird nach dem Haltepunkt problemlos geladen und wiedergegeben.

Hast du eine Ahnung, was ich falsch mache?

EDIT: Ich habe eine Rückverfolgung ausgeführt, als sie am Haltepunkt stoppt. Dies war die Ausgabe:

(lldb) bt
* Thread # 1: tid = 0x1c03, 0x30df1724 libc ++ abi.dylib`__cxa_throw, Stoppgrund = Haltepunkt 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: Fehler:] + 120

"LÖSUNG": Es stellt sich heraus, dass das Problem verschwindet, wenn ich den Ausnahme-Haltepunkt für alle Ausnahmen deaktiviere und den Haltepunkt nur für Objective-C-Ausnahmen verwende. Das Problem, dass die Zuweisung von AVAudioPlayer eine C ++ - Ausnahme auslöst, wird dadurch jedoch nicht gelöst.

ThomasCle
quelle
2
Ich hatte die gleiche Stapelverfolgung. Das Deaktivieren des Haltepunkts "Alle Ausnahmen" hat es mir nicht ermöglicht.
Makdad

Antworten:

175

Fügen Sie Ihren Ausnahme-Haltepunkt hinzu und bearbeiten Sie den Ausnahmetyp von "Alle" zu "Objective-C-Ausnahmen".

Einige Klassen in AudioToolbox lösen reguläre C ++ - Ausnahmen aus. Sie können sie auf diese Weise herausfiltern.

Mugunth
quelle
6
Da ich in meiner Frage den Abschnitt "LÖSUNG" geschrieben habe, betrachte ich dies nicht als Lösung. Das AVAudioPlayersollte keine zufälligen Ausnahmen auslösen.
ThomasCle
10
"AVAudioPlayer sollte keine zufälligen Ausnahmen auslösen" - Dies liegt nicht in unseren Händen. So ist das Framework geschrieben und man muss damit leben. Ich stimme jedoch zu, dass es keine gute Idee ist
Mugunth
@Mugunth Bedeutet dies, dass das Framework auf interne Fehler reagiert und diese korrigiert? Kennen Sie andere Dokumentationen dazu? Ich kann nicht viel online finden, was mir nahe legt, dass dies möglicherweise auf einen Programmiererfehler zurückzuführen ist ...
Entferner
21

AVAudioPlayer und AVAudioRecorder lösen beide Ausnahmen aus, einige davon. Diese werden intern von den Spielern behandelt, aber wenn Sie einen Haltepunkt für "Alle Haltepunkte" haben (dh Ausnahme: Alle, Unterbrechung: Beim Werfen), werden Sie diese Ausnahmen abfangen. Wenn Sie die Ausführung auf diesen fortsetzen, läuft die App normal weiter und stürzt überhaupt nicht ab.

Die einzige Lösung, die ich bisher gefunden habe, besteht darin, im Haltepunktnavigator auf die Haltepunktleiste zu klicken, diesen bestimmten Haltepunkt zu deaktivieren und ihn deaktiviert auszuführen.

Wenn / falls die App jemals mit einer ausgelösten Ausnahme abstürzt, drücke ich cmd-6, aktiviere diesen Haltepunkt und führe erneut aus und mache alles, was ich getan habe, als sie abgestürzt ist.

Bearbeiten: Die Einstellung auf "Objective-C-Ausnahmen" ist offensichtlich die Vorgehensweise. Siehe obige Antwort!

Kalle
quelle
9

Hier ist ein Screenshot, der zeigt, wie ich diesen Fehler behoben habe. Ich bin mir nicht sicher, ob dies der gleiche Weg ist, über den die obigen Antworten sprechen, aber ich gehe davon aus, dass es ähnlich ist.

  1. Gehen Sie zum Haltepunktnavigator in Xcode.
  2. Klicken Sie bei gedrückter Ctrl-Taste auf die Zeile "Alle Ausnahmen".
  3. Wählen Sie die Option 'Haltepunkt bearbeiten ...'.
  4. Ändern Sie das Exceptionvon Allnach Objective-C.

Geben Sie hier die Bildbeschreibung ein

Stewart Macdonald
quelle
2

Die Rückverfolgung hat sehr geholfen, danke!. Wir hatten vor kurzem angefangen, auf dasselbe Problem zu stoßen. Es stellte sich heraus, dass die MP3-Dateien, auf die sie geworfen wurden, kein gültiges ID3-Tag hatten und sie über eine App wie Tagr ausgeführt wurden, um sie sofort zu reparieren !

yo.ian.g
quelle
1
Nach dem Setzen fehlender Felder im ID3-Tag stoppte die App nicht mehr bei der Initialisierung des AVAudioPlayer, sondern bei der Spielanweisung ...
Reinhard Männer
Welche Felder wurden benötigt? Alle von ihnen?
Reggian
@ Reggian Ich erinnere mich nicht, es ist so lange her. Das tut mir leid! Ich kann mich nicht erinnern, dass ich fehlende Felder hinzufügen musste. Wenn ich mich richtig erinnere, hat es gereicht, sie nur durch ein Tag-Desinfektionsmittel zu führen.
yo.ian.g
2

In Xcode 9.2 können Sie bestimmte Ausnahmen deaktivieren, nachdem Sie sie gesehen haben. Öffnen Sie das Menü Haltepunkte und klicken Sie zum Deaktivieren (ausgeblendeter Pfeil).

Geben Sie hier die Bildbeschreibung ein

Quantumpotato
quelle
-4

Versuchen Sie, den AVAudioPlayer als Klassenvariable festzulegen!

Redestructa
quelle
1
In meinem Fall habe ich AVAudioPlayer bereits als Klassenvariable eingerichtet und es funktioniert immer noch nicht. Sieht so aus, als hätten Sie die Lösung nicht wirklich gekannt
Alex Cio