2014-10-06 5 views
6

내 응용 프로그램에서 iOS 8 (이전 iOS 버전이 아님)에서만 몇 초 동안 메인 스레드가 멈추는 것을보고 있습니다.
나는 여러 곳에서 @synchronised (self)을 사용 중이고 RemoteIO 설정을 사용 중입니다. 제 질문은 어떻게 주요 스레드가 차단하고 그 시간에 무엇을하는지와 같은 추가 정보를 얻을 수있는 곳을 어떻게 디버그합니까?
iOS 메인 스레드가 몇 초 동결됩니다.

Xcode 6을 사용하고 있으므로 디버깅하는 가장 좋은 방법을 알려주십시오.

편집 : 다음은 일시 중지 된 결과입니다.

난 당신이 동결가 발생하는 동안 단순히 디버거에서 일시 정지를 눌러 제안 무슨 일이 일어나고 있는지 이해하는 첫 번째 단계로

enter image description here

+0

악기를 살펴보십시오. – dandan78

+1

인 스트 루먼트 -> Time Profiler – kabarga

답변

9

enter image description here. 이 시점에서 어떤 스레드가 무엇을하고 있는지 보여줍니다.

아직 실행중인 작업이 표시되거나 msg_trap 행에 어딘가에 잠금이 있음을 나타냅니다.

여기에 귀하가 알아 낸 것을 게시하십시오.

+1

좋아, 아침부터 나를 미치게 만들었다. 시작할 때 메인 스레드가 매달려있을 때마다 멈 춥니 다. 실행중인 13 개의 보류 블록을 보여줍니다. 맨 위에 __semwait_signal이 표시되므로 일부 활동이 끝나기를 기다리는 주 스레드가 있습니까? 질문에 첨부 된 스크린 샷을 편집했습니다. –

+0

내가하는 일을 올바르게 이해하면 카메라에서 캡처 한 비디오를 처리해야합니다. 따라서 각 프레임을 처리하는 데 너무 오래 걸리거나 콜백이 너무 자주 호출되므로 호출 간에는 아무 것도 할 수 없습니다. 나는 이것이 당신의 코드라고 생각하여 Time Profiler가 도움이 될 수 있습니다. – hybridcattt

+0

사실 제가하는 일은 비싸지 않고 iOS 8에서만 발생합니다. iOS 8의 버그를 발견했기 때문에 때로는 (항상 그런 것은 아니지만) 주 스레드가 시작될 때 몇 초 동안 잠을 자도록 만듭니다. 수면 시간은 1 초에서 15 초까지 다양합니다. 나는 시간 프로파일 러를 사용했고 주 스레드가 usleep을 호출하는 것을 보여줍니다. 왜 메인 쓰레드가 usleep을 호출하는지는 내가 이해하지 못하는 것이다. –