AVAudioPlayer melempar breakpoint dalam mode debug

108

Setiap kali saya memuat aplikasi itu berhenti seolah-olah saya telah menetapkan breakpoint pada baris ini:

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

Tidak ada breakpoint di atas atau di mana pun di dekat garis ini. Itu hanya terjadi ketika saya menjalankan aplikasi dalam mode debug dan tidak ada yang mogok setelah breakpoint. Aplikasi ini berfungsi karena tidak ada yang terjadi saat saya mengklik "Lanjutkan eksekusi program".

Ini adalah metode loadData, yang dipanggil dengan initWithData:

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

Fungsi loadData tampaknya berfungsi dengan baik. File mp3 yang diminta dimuat dan diputar tanpa masalah setelah breakpoint.

Apakah Anda tahu apa yang saya lakukan salah?

EDIT: Saya menjalankan backtrace ketika berhenti di breakpoint. Ini adalah hasilnya:

(lldb) bt
* utas # 1: tid = 0x1c03, 0x30df1724 libc ++ abi.dylib`__cxa_throw, alasan berhenti = breakpoint 1.2
    bingkai # 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
    bingkai # 2: 0x36403b0e AudioToolbox`ID3ParserOpen + 142
    bingkai # 3: 0x3635bd16 AudioToolbox`MPEGAudioFile :: ParseID3Tags () + 58
    bingkai # 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
    bingkai # 6: 0x36316480 AudioToolbox`AudioFileOpenWithCallbacks + 612
    bingkai # 7: 0x31f4c1ec AVFoundation`- [AVAudioPlayer initWithData: error:] + 120

"SOLUSI": Ternyata, jika saya menonaktifkan breakpoint pengecualian untuk semua pengecualian dan hanya menggunakan breakpoint untuk pengecualian Objective-C, masalahnya akan hilang. Tapi itu tidak menyelesaikan masalah alokasi AVAudioPlayer memunculkan pengecualian C ++.

ThomasCle
sumber
2
Saya memiliki jejak tumpukan yang sama. Menonaktifkan breakpoint "Semua Pengecualian" membuatnya tidak terjadi pada saya.
makdad

Jawaban:

175

Tambahkan breakpoint pengecualian Anda dan edit jenis pengecualian dari "Semua" menjadi "pengecualian Objective-C"

Beberapa kelas di AudioToolbox menampilkan pengecualian C ++ biasa. Anda dapat memfilternya dengan cara ini.

Mugunth
sumber
6
Karena saya telah menulis bagian "SOLUSI" dalam pertanyaan saya, saya tidak menganggap ini sebagai solusi. The AVAudioPlayerseharusnya tidak membuang pengecualian acak.
ThomasCle
10
"AVAudioPlayer tidak boleh membuang pengecualian acak" - Ini tidak ada di tangan kami. Begitulah cara kerangka ditulis dan Anda harus menerimanya. Padahal, saya setuju bahwa itu bukan ide yang baik
Mugunth
@Mugunth Apakah ini berarti bahwa kerangka kerja menanggapi dan memperbaiki kesalahan internal? Apakah Anda mengetahui adanya dokumentasi lain di dalamnya? Saya tidak dapat menemukan banyak informasi online yang menunjukkan kepada saya bahwa ini mungkin karena kesalahan programmer ...
Remover
21

AVAudioPlayer dan AVAudioRecorder keduanya akan menampilkan pengecualian, beberapa di antaranya. Ini ditangani secara internal oleh para pemain tetapi jika Anda memiliki breakpoint untuk "Semua Breakpoints" (yaitu Pengecualian: Semua, Istirahat: Saat Lempar) Anda akan menangkap pengecualian ini. Jika Anda melanjutkan eksekusi ini, aplikasi akan terus berjalan normal dan tidak macet sama sekali.

Satu-satunya solusi yang saya dapatkan sejauh ini adalah mengklik bilah breakpoint di Breakpoint Navigator, menonaktifkan breakpoint khusus ini, dan menjalankannya dengan nonaktif.

Ketika / jika aplikasi pernah crash dengan pengecualian yang dilempar, saya cmd-6, mengaktifkan breakpoint itu, dan menjalankan kembali dan melakukan apa pun yang saya lakukan saat crash.

Edit: pengaturan ke "pengecualian Objective-C" jelas bagaimana melakukannya. Lihat jawaban di atas!

Kalle
sumber
9

Berikut tangkapan layar yang menunjukkan bagaimana saya memperbaiki kesalahan ini. Saya tidak yakin apakah ini adalah cara yang sama yang dibicarakan oleh jawaban di atas, tetapi saya menganggapnya serupa.

  1. Pergi ke navigator Breakpoint di Xcode.
  2. Kontrol-klik pada baris 'Semua Pengecualian'.
  3. Pilih opsi 'Edit Breakpoint ...'.
  4. Ubah Exceptiondari Allmenjadi Objective-C.

masukkan deskripsi gambar di sini

Stewart Macdonald
sumber
2

Backtrace banyak membantu, terima kasih !. Kami mulai mengalami masalah yang sama baru-baru ini. Ternyata file mp3 yang dilempar tidak memiliki tag ID3 yang valid dan menjalankannya melalui aplikasi seperti Tagr memperbaikinya!

yo.ian.g
sumber
1
Setelah menyetel bidang yang hilang dalam tag ID3, aplikasi tidak lagi berhenti pada inisialisasi AVAudioPlayer, tetapi masih berhenti pada instruksi bermain ...
Reinhard Männer
Bidang mana yang diperlukan? Mereka semua?
reggian
@Reggian Saya tidak ingat, itu sudah lama sekali. Maaf soal itu! Saya tidak ingat perlu menambahkan bidang apa pun yang hilang, menjalankannya melalui pembersih tag sudah cukup jika saya ingat dengan benar!
yo.ian.g
2

Di Xcode 9.2 Anda dapat menonaktifkan pengecualian tertentu setelah Anda melihatnya. Buka menu breakpoints dan klik untuk menonaktifkan (panah pudar)

masukkan deskripsi gambar di sini

quantumpotato.dll
sumber
-4

Coba atur AVAudioPlayer sebagai Variabel kelas!

redestructa
sumber
1
Dalam kasus saya, saya sudah menyiapkan AVAudioPlayer sebagai variabel kelas dan masih tidak berfungsi. Sepertinya Anda tidak benar-benar tahu solusinya
Alex Cio