2014-03-28 5 views
1

JavaScriptCore을 사용하여 다가오는 앱에서 비즈니스 로직의 대부분을 실행합니다. 이제 다음 모든 다음과 같은 오류와 응용 프로그램의 충돌 :iOS의 JavaScriptCore : JavaScript 가비지 수집이 실패했습니다.

FATAL ERROR: JavaScript garbage collection failed because thread_get_state returned an error (268435459). This is probably the result of running inside Rosetta, which is not supported. 
/SourceCache/JavaScriptCoreEmbedded/JavaScriptCoreEmbedded-1218.33/heap/MachineStackMarker.cpp(350) : size_t JSC::getPlatformThreadRegisters(const PlatformThread &, PlatformThreadRegisters &) 

그것은 아이폰 OS, 그래서 그것은 확실히 로제타에서 실행되지, 그리고 에뮬레이터와 실제 아이폰에서 모두 발생합니다.

URLSession을 사용하여 이미지를 업로드 할 때 주로 발생하는 것으로 보입니다. 원래 호출 한 스레드가 아닌 다른 스레드의 콜백이이 오류를 줄 수도 있지만 도움이되지 않았기 때문에 다른 스레드를 사용하여 자바 스크립트 컨텍스트에 대한 모든 호출이 동일한 스레드에서 수행되는지 확인했습니다. (그리고 JavaScriptCore 설명서에 따르면 JavaScriptCore은 완전히 스레드 안전해야합니다.)

그래서 아무도 아이디어가 있습니까?

+0

당신은 http://stackoverflow.com/help/mcve – bosnjak

+0

을 포함해야합니다. 불행히도, 그 문제의 일부이며, 적어도 하나 또는 그 이상을 전체 신청서를 제출하지 않고서는 찾을 수 없습니다. 겉으로보기에는 무작위로 크래시가 발생했으며 크래시를 일으키는 원인을 추적 할 수 없었습니다. 다른 시간과 다른 호출에서 충돌합니다. 우리는 최소한의 검증 가능한 버전을 찾으려고 노력하고 있으며, 우리가 문제를 해결했을 수도 있지만, 현재로서는 우리가 할 수 없었습니다 ... – Patrik

+0

그래서, 기본적으로, 우리는 무엇이 잘못되었는지에 대한 정확한 대답은 코드 예제가 없다면 분명히 불가능하기 때문입니다. 우리는 누군가 어떤 상황/실수/버그가 발생했는지 알기를 원합니다. 우리는 이미 다른 스레드로부터 콜백을 생성하면이 일이 발생할 수 있다고 들었습니다 (우리는 그렇지 않습니다). 그래서이 상황을 일으키는 다른 상황이 발생했습니다. – Patrik

답변

0

JavaScript가 Objective-C의 콜백을 설정하여 메시지를 수신하는 경우에 발생할 수 있습니다. ObjC가 설정된 동일한 스레드에서 Javascript 콜백을 호출하는지 확인하십시오.

우리가 이것을 확인할 수 있도록 일부 코드도 게시하십시오.

+0

글쎄, 내가 원래의 게시물에서 말했듯이 : "우리는 자바 스크립트 컨텍스트에 대한 모든 호출이 동일한 스레드에서 만들어 졌는지 확인했습니다. 원래 호출 한 스레드가 아닌 다른 스레드의 콜백이이 오류를 줄 수 있기 때문입니다 그러나 그것은 도움이되지 않았다. " 콜백도 포함됩니다. 불명확 한 점이 있다면 알려주세요. 콜백을 포함하여 ObjC에서 Javascript 로의 모든 호출은 자바 스크립트 작업 스레드에서 수행됩니다. – Patrik

0

비슷한 문제가 발생했습니다.

내 솔루션은 컨텍스트를 만든 스레드가 죽지 않도록하는 것이 었습니다. 아무것도하지 않아도되지만 스레드 상태를 얻으려는 오류가 스레드가 죽지 않는 것과 관련이 있다고 의심됩니다.

이 잠재적 인 관계를 어떻게 찾았는지 궁금한 사람은 인터프리터가 만든 동일한 스레드에서 콜백을 실행하도록 코드를 리팩터링했습니다 (커뮤니티의 가장 중요한 솔루션). 이 문제를 좁힐 때까지 여러 가지 방법으로 문제를 재현했습니다.

이 상황을 테스트하기 위해 스레드를 유지해야하는 경우 dispatch_semaphore_wait을 호출하기 직전에 생성 한 것과 같이 신호가 전송되지 않는 세마포어에 대해 dispatch_semaphore_wait을 사용하면 쉬운 방법이 될 수 있습니다.

관련 문제