2012-01-20 3 views
1

상당히 큰 코드 세트의 어딘가에 스레드 안전 버그가 있습니다. 시뮬레이터에서 수초 동안 내 CATiledLayer에서 스크롤하여 랜덤 크래시로 재현 할 수 있으며, 단일 스레드로 내 드로잉 코드를 잠그면 해결할 수 있습니다 (이상적이지 않습니다. CATiledLayer는 멀티 스레드 및 드로잉으로 설계되었으므로 이상적이지 않습니다). 코드가 충분히 느리다).iOS에서 디버그 스레드 안전 문제

스레드 안전 문제를 디버깅하려면 어떻게해야합니까? 그게 내 코드 어딘가에 느슨하게 가져올 (및 캐시) 데이터를 그릴 수 의심되는 있지만 그 많이 좁히지 않습니다.

동시성 프로그래밍 가이드를 읽지는 않았지만 디버깅에 대해 이야기하는 내용이 전혀 없으며 코드 구조화 방법에 대해서만 설명합니다.

+0

잠시 동안 회전하고 정적 이미지를 반환하는 간단한 코드로 "그려지는 데이터를 지연 게 처리 (및 캐시)하는 코드"를 대체 하시겠습니까? –

+0

데이터는 몇 기가 바이트의 벡터 데이터 (지도)입니다. 나는 RAM에이 모든 것을 저장할 수 없으며 벡터가 아닌 비트 맵 이미지 인 경우 iOS 장치에 맞지 않을 수도 있습니다. –

+0

실제 데이터를 반환 할 필요는 없습니다. 더미 데이터를 반환하는 * 단순한 * 메서드 여야합니다 (이상적으로 "실제"데이터를 반환하는 것과 거의 같은 시간/CPU를 사용하는 것이 좋습니다) 원래 메서드에서 문제인지 확인하는 것이 좋습니다. –

답변

1

어떤 동시성 메서드를 사용합니까? GCD 또는 NSThread? 그리기 위해 단일 스레드를 사용하도록 설득 할 수없는 경우 setter/getter 메서드 (또는 합성 된 setter/getter를 사용하는 경우 원자 속성)에 @syncronized을 사용하려고합니다.

+0

어떤 동시성 방법이 사용되고 있는지는 모르겠지만 아마도 GCD입니다. CATiledLayer는이 모든 작업을 수행하고 있으며 각 실제 CPU 코어에서 한 번에 하나의 타일을 그리도록 지시합니다 (A4 CPU의 단일 배경 스레드이므로 많은 시간이 걸릴 때까지 버그를 발견하지 못했습니다). 암호). 설명서에 따르면 핵심 그래픽은 모두 스레드로부터 안전합니다. 그리고 데이터를 액세스 할 수있는 모든 코드가 스레드 안전 (나는 dispatch_sync를 사용하고 있습니다)하지만 분명히 버그가 있습니다. . 물론 모든 코드를 읽는 것 외에 다른 방법이 있습니까? 그게 며칠 걸릴거야. –

+2

음, 프로파일 링 (Instruments)을 시도하고 메모리 누수와 좀비를 찾아 볼 수 있습니다. 그리고 GCD의 dispatch_sync를 사용하기 때문에, 여러 개의 큐가 같은 이름을 가질 수 있다는 것을 알고 계십니까? 따라서 dispatch_sync를 시작할 때 dispatch_sync 명령에서 queue를 만들면 기본적으로 다른 스레드를 만듭니다. 일시적인 해결책은 응용 프로그램 런타임 중 항상 지속되는 큐 관리자를 작성하는 것입니다. 큐 관리자는 애니메이션에 대한 모든 사전 작성 대기열에 대한 참조를 보유합니다. –