AVAudioPlayer พ่นเบรกพอยต์ในโหมดดีบัก


108

ทุกครั้งที่ฉันโหลดแอพมันจะหยุดราวกับว่าฉันตั้งเบรกพอยต์ไว้ในบรรทัดนี้:

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

ไม่มีจุดพักด้านบนหรือที่ใด ๆ ใกล้กับเส้นนี้ จะเกิดขึ้นเฉพาะเมื่อฉันเรียกใช้แอปในโหมดดีบักและไม่มีอะไรขัดข้องหลังจากเบรกพอยต์ แอปทำงานเหมือนไม่มีอะไรเกิดขึ้นเมื่อฉันคลิก "ดำเนินการโปรแกรมต่อ"

นี่คือเมธอด loadData ซึ่งเรียกด้วยinitWithData:

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

ดูเหมือนว่าฟังก์ชัน loadData จะทำงานได้ดี ไฟล์ mp3 ที่ร้องขอจะถูกโหลดและเล่นโดยไม่มีปัญหาใด ๆ หลังจากเบรกพอยต์

คุณรู้ไหมว่าฉันทำอะไรผิด?

แก้ไข: ฉันวิ่งถอยหลังเมื่อหยุดที่จุดพัก นี่คือผลลัพธ์:

(lldb) bt
* เธรด # 1: tid = 0x1c03, 0x30df1724 libc ++ abi.dylib`__cxa_throw เหตุผลหยุด = เบรกพอยต์ 1.2
    เฟรม # 0: 0x30df1724 libc ++ abi.dylib`__cxa_throw
    เฟรม # 1: 0x36403a24 AudioToolbox`ID3ParserHandle :: ID3ParserHandle (โมฆะ * ยาว (*) (โมฆะ * ยาวไม่ได้ลงนามยาวไม่ได้ลงนามยาวไม่ได้ลงนามเป็นโมฆะ ** ยาวไม่ได้ลงชื่อ *)) + 452
    เฟรม # 2: 0x36403b0e AudioToolbox`ID3ParserOpen + 142
    เฟรม # 3: 0x3635bd16 AudioToolbox`MPEGAudioFile :: ParseID3Tags () + 58
    เฟรม # 4: 0x3635b9aa AudioToolbox`MPEGAudioFile :: ParseAudioFile () + 26
    เฟรม # 5: 0x3631723e AudioToolbox`AudioFileObject :: DoOpenWithCallbacks (void *, long (*) (void *, long long, unsigned long, void *, unsigned long *), long (*) (void *, long long, unsigned long , โมฆะ const *, ไม่ได้ลงนาม long *), long long (*) (void *), long (*) (void *, long long)) + 166
    เฟรม # 6: 0x36316480 AudioToolbox`AudioFileOpenWithCallbacks + 612
    เฟรม # 7: 0x31f4c1ec AVFoundation`- [AVAudioPlayer initWithData: ข้อผิดพลาด:] + 120

"วิธีแก้ปัญหา":ปรากฎว่าถ้าฉันปิดใช้เบรกพอยต์ข้อยกเว้นสำหรับข้อยกเว้นทั้งหมดและใช้เบรกพอยต์สำหรับ Objective-C เท่านั้นปัญหาจะหายไป แต่ไม่ได้แก้ปัญหาที่การจัดสรร AVAudioPlayer ทำให้เกิดข้อยกเว้น C ++


2
ฉันมีสแต็กเทรซเดียวกัน การปิดเบรกพอยต์ "ข้อยกเว้นทั้งหมด" ทำให้ไม่เกิดขึ้นสำหรับฉัน
makdad

คำตอบ:


175

เพิ่มเบรกพอยต์ข้อยกเว้นของคุณและแก้ไขประเภทข้อยกเว้นจาก "ทั้งหมด" เป็น "ข้อยกเว้นของ Objective-C"

บางคลาสใน AudioToolbox มีข้อยกเว้น C ++ ปกติ คุณสามารถกรองออกได้ด้วยวิธีนี้


6
ตามที่ฉันได้เขียนหัวข้อ "วิธีแก้ปัญหา" ไว้ในคำถามของฉันฉันไม่ถือว่านี่เป็นวิธีแก้ปัญหา AVAudioPlayerไม่ควรโยนข้อยกเว้นแบบสุ่ม
ThomasCle

10
"AVAudioPlayer ไม่ควรโยนข้อยกเว้นแบบสุ่ม" - สิ่งนี้ไม่ได้อยู่ในมือของเรา นั่นคือวิธีการเขียนกรอบและคุณต้องอยู่กับมัน แม้ว่าฉันยอมรับว่ามันไม่ใช่ความคิดที่ดี
Mugunth

@Mugunth นี่หมายความว่าเฟรมเวิร์กกำลังตอบสนองและแก้ไขข้อผิดพลาดภายในหรือไม่? คุณทราบเอกสารอื่น ๆ ในเอกสารนี้หรือไม่? ฉันไม่สามารถหาข้อมูลออนไลน์ได้มากนักซึ่งแนะนำให้ฉันทราบว่านี่อาจเป็นข้อผิดพลาดของโปรแกรมเมอร์ ...
Remover

21

AVAudioPlayer และ AVAudioRecorder ทั้งสองจะมีข้อยกเว้นหลายข้อ สิ่งเหล่านี้ได้รับการจัดการภายในโดยผู้เล่น แต่ถ้าคุณมีเบรกพอยต์สำหรับ "เบรกพอยต์ทั้งหมด" (เช่น Exception: All, Break: On Throw) คุณจะพบข้อยกเว้นเหล่านี้ หากคุณดำเนินการกับสิ่งเหล่านี้ต่อไปแอปจะยังคงทำงานได้ตามปกติและไม่ผิดพลาดเลย

ทางออกเดียวที่ฉันคิดขึ้นมาคือคลิกที่แถบเบรกพอยต์ใน Breakpoint Navigator ปิดการใช้งานเบรกพอยต์เฉพาะนี้และปิดใช้งานโดยปิดใช้งาน

เมื่อใด / หากแอปขัดข้องโดยมีข้อยกเว้นการโยน I cmd-6 เปิดใช้งานเบรกพอยต์แล้วรันใหม่และทำทุกอย่างที่ฉันทำเมื่อเกิดข้อผิดพลาด

แก้ไข: การตั้งค่าเป็น "ข้อยกเว้น Objective-C" เป็นวิธีการที่ชัดเจน ดูคำตอบด้านบน!


9

นี่คือภาพหน้าจอที่แสดงวิธีแก้ไขข้อผิดพลาดนี้ ฉันไม่แน่ใจว่านี่เป็นวิธีเดียวกับที่คำตอบข้างบนพูดถึงหรือเปล่า แต่ฉันคิดว่ามันคล้ายกัน

  1. ไปที่เครื่องนำทางเบรกพอยต์ใน Xcode
  2. คลิกควบคุมที่บรรทัด 'ข้อยกเว้นทั้งหมด'
  3. เลือกตัวเลือก 'แก้ไขเบรกพอยต์ ... '
  4. เปลี่ยนExceptionจากAllเป็นObjective-C.

ใส่คำอธิบายภาพที่นี่


2

backtrace ช่วยได้มากขอบคุณ!. เราเริ่มพบปัญหาเดียวกันเมื่อเร็ว ๆ นี้ ปรากฎว่าไฟล์ mp3 ที่ถูกขว้างไปไม่มีแท็ก ID3 ที่ถูกต้องและเรียกใช้ผ่านแอพเช่นTagrแก้ไขได้ทันที!


1
หลังจากตั้งค่าช่องที่ขาดหายไปในแท็ก ID3 แอปไม่ได้หยุดที่การเริ่มต้น AVAudioPlayer อีกต่อไป แต่ยังหยุดอยู่ที่คำแนะนำการเล่น ...
Reinhard Männer

ต้องกรอกข้อมูลในช่องใด พวกเขาทุกคน?
reggian

@ Reggian ฉันจำไม่ได้ว่ามันนานมาแล้ว ขอโทษด้วยกับเรื่องนั้น! ฉันจำไม่ได้ว่าจำเป็นต้องเพิ่มช่องใด ๆ ที่หายไปเพียงแค่เรียกใช้ผ่านเครื่องฆ่าเชื้อแท็กก็เพียงพอแล้วถ้าฉันจำไม่ผิด!
yo.ian.g

2

ใน Xcode 9.2 คุณสามารถปิดใช้งานข้อยกเว้นเฉพาะหลังจากที่คุณเห็นแล้ว เปิดเมนูเบรกพอยต์และคลิกเพื่อปิดใช้งาน (ลูกศรจาง)

ใส่คำอธิบายภาพที่นี่


-4

ลองตั้งค่า AVAudioPlayer เป็น Class Variable!


1
ในกรณีของฉันฉันตั้งค่า AVAudioPlayer เป็นตัวแปรคลาสแล้ว แต่ก็ยังใช้งานไม่ได้ ดูเหมือนว่าคุณไม่รู้วิธีแก้ปัญหาจริงๆ
Alex Cio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.