AVAudioPlayer가 디버그 모드에서 중단 점을 throw합니다.


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 (void *, long (*) (void *, unsigned long, unsigned long, unsigned long, void **, unsigned long *)) + 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 , void const *, unsigned long *), long long (*) (void *), long (*) (void *, long long)) + 166
    프레임 # 6 : 0x36316480 AudioToolbox`AudioFileOpenWithCallbacks + 612
    프레임 # 7 : 0x31f4c1ec AVFoundation`- [AVAudioPlayer initWithData : error :] + 120

"해결책": 모든 예외에 대해 예외 중단 점을 비활성화하고 Objective-C 예외에만 중단 점을 사용하면 문제가 사라집니다. 그러나 AVAudioPlayer 할당시 C ++ 예외가 발생하는 문제는 해결되지 않습니다.


2
동일한 스택 추적이 있습니다. "모든 예외"중단 점을 비활성화하면 나에게 발생하지 않습니다.
— makdad

답변:


175

예외 중단 점을 추가하고 예외 유형을 "모두"에서 "Objective-C 예외"로 편집하십시오.

AudioToolbox의 일부 클래스는 일반 C ++ 예외를 발생시킵니다. 이런 식으로 필터링 할 수 있습니다.


6
내 질문에 "솔루션"섹션을 작성 했으므로이를 해결책으로 생각하지 않습니다. 는 AVAudioPlayer임의 예외가 발생하지 않아야합니다.
— ThomasCle

10
"AVAudioPlayer는 임의의 예외를 던져서는 안됩니다."-이것은 우리 손에있는 것이 아닙니다. 그것이 프레임 워크가 작성되는 방식이며 여러분은 그 프레임 워크와 함께 살아야합니다. 비록, 나는 그것이 좋은 생각이 아니라고 동의
— Mugunth

@Mugunth 이것은 프레임 워크가 내부 오류에 응답하고 수정하고 있음을 의미합니까? 그것에 대한 다른 문서를 알고 있습니까? 나는 이것이 프로그래머 오류로
— Remover

21

AVAudioPlayer와 AVAudioRecorder는 둘 다 예외를 발생시킵니다. 이들은 플레이어에 의해 내부적으로 처리되지만 "All Breakpoints"(예 : 예외 : All, Break : On Throw)에 대한 중단 점이있는 경우 이러한 예외를 포착합니다. 계속 실행하면 앱이 계속 정상적으로 실행되고 전혀 충돌하지 않습니다.

내가 지금까지 생각 해낸 유일한 해결책은 Breakpoint Navigator에서 중단 점 막대를 클릭하고이 특정 중단 점을 비활성화 한 다음 비활성화 된 상태로 실행하는 것입니다.

예외가 발생하여 앱이 충돌하는 경우 나는 cmd-6을 사용하고 중단 점을 활성화 한 다음 다시 실행하고 충돌했을 때했던 작업을 수행합니다.

편집 : "Objective-C 예외"로 설정하는 것은 분명히 방법입니다. 위의 답변을 참조하십시오!


9

다음은이 오류를 수정 한 방법을 보여주는 스크린 샷입니다. 이것이 위의 답변이 말하는 것과 같은 방식인지 확실하지 않지만 비슷하다고 가정합니다.

  1. Xcode의 중단 점 탐색기로 이동합니다.
  2. '모든 예외'줄을 Control- 클릭합니다.
  3. '중단 점 편집 ...'옵션을 선택합니다.
  4. 변경 Exception에서 All에 Objective-C.

여기에 이미지 설명 입력


2

역 추적은 많은 도움이되었습니다. 감사합니다!. 최근에 같은 문제가 발생하기 시작했습니다. 던지고 있던 mp3 파일에 유효한 ID3 태그가 없으며 Tagr 와 같은 앱을 통해 실행 하여 바로 수정했습니다!


1
ID3 태그에서 누락 필드를 설정 한 후, 앱이 AVAudioPlayer의 초기화에서 더 이상 정지하지 않았다,하지만 여전히 ... 재생 명령에 중지
— 라인 하르트 방식을

어떤 필드가 필요 했습니까? 그들 모두?
— reggian 2016-11-02

@Reggian 기억이 나지 않습니다. 너무 오래 전 일이었습니다. 미안합니다! 누락 된 필드를 추가 할 필요가 없었던 기억이 없습니다. 올바르게 기억하면 태그 새니 타이 저를 통해 실행하는 것만으로도 충분했습니다!
— yo.ian.g 2016

2

Xcode 9.2에서는 특정 예외를 본 후에 비활성화 할 수 있습니다. 중단 점 메뉴를 열고 클릭하여 비활성화 (흐린 화살표)

여기에 이미지 설명 입력


-4

AVAudioPlayer를 클래스 변수로 설정해보십시오!


1
제 경우에는 이미 AVAudioPlayer를 클래스 변수로 설정했지만 여전히 작동하지 않습니다. 당신 같은 외모는 정말 솔루션 몰랐어요
— 알렉스 C10의
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.