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에서 AllObjective-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.