2012-03-13 47 views
99

Mỗi lần tôi tải ứng dụng nó dừng lại như thể tôi đã thiết lập một breakpoint trên dòng này:AVAudioPlayer ném breakpoint trong chế độ gỡ lỗi

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

Không có breakpoint trên hoặc bất cứ nơi nào gần dòng này. Nó chỉ xảy ra khi tôi chạy các ứng dụng trong chế độ gỡ lỗi và không có gì treo sau breakpoint. Ứ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 pháp 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; 
} 

Chức năng loadData dường như làm việc 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?

EDIT: Tôi đã chạy ngược lại khi dừng tại điểm ngắt. Đây là kết quả:

 
(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 
    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 tắt breakpoint ngoại lệ cho tất cả các trường hợp ngoại lệ và chỉ sử dụng breakpoint cho trường hợp ngoại lệ Objective-C vấn đề biến mất. Nhưng nó không giải quyết được vấn đề rằng việc phân bổ AVAudioPlayer ném một ngoại lệ C++.

+1

tôi đã có vết đống cùng. Vô hiệu hóa điểm ngắt "Tất cả ngoại lệ" khiến nó không xảy ra đối với tôi. – makdad

Trả lời

159

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

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

+4

Vì 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à giải pháp. 'AVAudioPlayer' không nên ném ngoại lệ ngẫu nhiên. –

+10

"AVAudioPlayer không nên ném ngoại lệ ngẫu nhiên" - Đây không phải là trong tay của chúng tôi. Đó là cách khuôn khổ được viết và bạn phải sống với nó. Mặc dù, tôi đồng ý rằng đó không phải là ý tưởng hay: – Mugunth

+0

@Mugunth Điều này có nghĩa là khung công tác đang phản hồi và sửa 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 cho thấy rằng điều này có thể là do lỗi lập trình viên ... – Remover

20

AVAudioPlayer và AVAudioRecorder cả hai sẽ ném ngoại lệ, một vài trong số đó. Chúng được xử lý nội bộ bởi người chơi nhưng nếu bạn có điểm ngắt cho "Tất cả điểm ngắt" (ví dụ: Ngoại lệ: Tất cả, Break: On Throw), 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 trê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.

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

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

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

2

Backtrace đã giúp ích rất nhiều, cảm ơn !. Chúng tôi đã bắt đầu chạy vào cùng một vấn đề gần đây. Nó chỉ ra các tập tin mp3 nó đã được ném vào không có một thẻ ID3 hợp lệ và chạy chúng thông qua một ứng dụng như Tagr cố định chúng ngay lập tức!

+1

Sau khi thiết lập các trường bị thiếu trong thẻ ID3, ứng dụng không còn dừng lại khi khởi tạo AVAudioPlayer, nhưng nó vẫn dừng lại ở hướng dẫn chơi ... –

+0

Trường nào được yêu cầu? Tất cả bọn họ? – Reggian

+0

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

-4

Thử đặt AVAudioPlayer thành biến lớp học!

+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. Có vẻ như bạn không thực sự biết giải pháp –

4

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

  1. Chuyển đến trình điều hướng Breakpoint trong Xcode.
  2. Kiểm soát nhấp vào dòng 'Tất cả ngoại lệ'.
  3. Chọn tùy chọn 'Chỉnh sửa điểm dừng ...'.
  4. Thay đổi số Exception từ All thành Objective-C.

enter image description here

1

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

enter image description here

Các vấn đề liên quan