AVAudioPlayer ném điểm ngắt trong chế độ gỡ lỗi


108

Mỗi khi tôi tải ứng dụng, nó sẽ dừng lại như thể tôi đã đặt một điểm ngắt trên dòng này:

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

Không có điểm dừng ở trên hoặc bất kỳ nơi nào gần đường này. Nó chỉ xảy ra khi tôi chạy ứng dụng ở chế độ gỡ lỗi và không có gì bị lỗi sau điểm ngắt. Ứng dụng hoạt động như không có gì xảy ra khi tôi nhấp vào "Tiếp tục thực hiện chương trình".

Đây là phương thức loadData, được gọi với initWithData:

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

Hàm loadData dường như đang hoạt động tốt. Tệp mp3 được yêu cầu được tải và phát mà không gặp bất kỳ sự cố nào sau điểm ngắt.

Bạn có biết tôi đang làm gì sai không?

CHỈNH SỬA: Tôi đã chạy một dấu lùi khi nó dừng lại ở điểm ngắt. Đây là đầu ra:

(lldb) bt
* chủ đề # 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

"GIẢI PHÁP": Hóa ra, nếu tôi vô hiệu hóa điểm ngắt ngoại lệ cho tất cả các ngoại lệ và chỉ sử dụng điểm ngắt cho các ngoại lệ Objective-C, vấn đề sẽ biến mất. Nhưng nó không giải quyết được vấn đề là việc cấp phát AVAudioPlayer ném một ngoại lệ C ++.


2
Tôi đã có cùng một dấu vết ngăn xếp. Việc tắt điểm ngắt "Tất cả các trường hợp ngoại lệ" đã không xảy ra với tôi.
makdad

Câu trả lời:


175

Thêm điểm ngắt ngoại lệ của bạn và chỉnh sửa loại ngoại lệ từ "Tất cả" thành "Ngoại lệ Objective-C"

Một số lớp trong AudioToolbox ném các ngoại lệ C ++ thông thường. Bạn có thể lọc chúng theo cách này.


6
Như tôi đã viết phần "GIẢI PHÁP" trong câu hỏi của mình, tôi không coi đây là một giải pháp. Không AVAudioPlayernên ném các ngoại lệ ngẫu nhiên.
ThomasCle 22/10/12

10
"AVAudioPlayer không nên ném các ngoại lệ ngẫu nhiên" - Điều này không nằm trong tay của chúng tôi. Đó là cách mà framework được viết và bạn phải sống với nó. Mặc dù vậy, tôi đồng ý rằng đó không phải là một ý kiến ​​hay
Mugunth 11/113

@Mugunth Điều này có nghĩa là khuôn khổ đang phản hồi và sửa các lỗi nội bộ? Bạn có biết bất kỳ tài liệu nào khác về nó không? Tôi không thể tìm thấy nhiều trực tuyến mà gợi ý với tôi rằng điều này có thể xuống đến lỗi lập trình viên ...
Remover

21

Cả AVAudioPlayer và AVAudioRecorder đều sẽ đưa ra các ngoại lệ, một vài trong số đó. Những điều này được xử lý nội bộ bởi người chơi nhưng nếu bạn có một điểm ngắt cho "Tất cả các điểm phá vỡ" (tức là Ngoại lệ: Tất cả, Phá vỡ: Khi ném) bạn sẽ bắt được những ngoại lệ này. Nếu bạn tiếp tục thực hiện các ứng dụng này, ứng dụng sẽ tiếp tục chạy bình thường và không bị lỗi gì cả.

Giải pháp duy nhất mà tôi đưa ra cho đến nay là nhấp vào thanh điểm ngắt trong Bộ điều hướng điểm ngắt, tắt điểm ngắt cụ thể này và chạy khi nó bị vô hiệu hóa.

Khi / nếu ứng dụng gặp sự cố với một ngoại lệ được ném ra, tôi cmd-6, kích hoạt điểm ngắt đó và chạy lại và làm bất cứ điều gì tôi đã làm khi nó gặp sự cố.

Chỉnh sửa: đặt thành "Ngoại lệ Objective-C" rõ ràng là cách thực hiện. Xem câu trả lời trên!


9

Đây là ảnh chụp màn hình cho thấy cách tôi sửa lỗi này. Tôi không chắc liệu đây có giống như cách mà các câu trả lời ở trên đang nói về hay không, nhưng tôi cho rằng nó tương tự.

  1. Đi tới trình điều hướng Breakpoint trong Xcode.
  2. Control khi nhấp vào dòng 'Tất cả các trường hợp ngoại lệ'.
  3. Chọn tùy chọn 'Chỉnh sửa điểm ngắt ...'.
  4. Thay đổi Exceptiontừ Allthành Objective-C.

nhập mô tả hình ảnh ở đây


2

Backtrace đã giúp rất nhiều, cảm ơn !. Gần đây chúng tôi đã bắt đầu gặp phải vấn đề tương tự. Hóa ra các tệp mp3 mà nó đang ném vào không có thẻ ID3 hợp lệ và việc chạy chúng thông qua một ứng dụng như Tagr đã sửa chúng ngay lập tức!


1
Sau khi thiết lập các lĩnh vực còn thiếu trong các thẻ ID3, ứng dụng đã không dừng lại lâu hơn ở khởi của AVAudioPlayer, nhưng nó vẫn dừng lại ở sự hướng dẫn chơi ...
Reinhard cách

Những trường nào được yêu cầu? Tất cả bọn họ?
reggian

@Reggian Tôi không nhớ lại, nó đã quá lâu rồi. Xin lỗi vì điều đó! Tôi không nhớ cần phải thêm bất kỳ trường nào bị thiếu, chỉ cần chạy nó thông qua trình khử trùng thẻ là đủ nếu tôi nhớ chính xác!
yo.ian.g

2

Trong Xcode 9.2, bạn có thể vô hiệu hóa các ngoại lệ cụ thể sau khi đã nhìn thấy chúng. Mở menu điểm ngắt và nhấp để tắt (mũi tên mờ)

nhập mô tả hình ảnh ở đây


-4

Hãy thử đặt AVAudioPlayer làm Biến lớp!


1
Trong trường hợp của tôi, tôi đã thiết lập AVAudioPlayer làm biến lớp và nó vẫn không hoạt động. Trông giống như bạn thực sự không biết giải pháp
Alex Cio
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.