2014-03-28 53 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 &) 

它的IOS,所以它絕對不是羅塞塔運行,並且無論是在模擬器和真正的iPhone發生。

它似乎主要發生在使用URLSession上傳圖像時。我們確保所有調用JavaScript上下文的調用都來自同一個線程,因爲我們在其他地方看到,來自另一個線程的回調比最初調用的線程可能會出現此錯誤,但這並沒有幫助。 (而且,根據JavaScriptCore文檔,JavaScriptCore反正應該是完全線程安全的)

那麼,有人有什麼想法嗎?

+0

你應該包括http://stackoverflow.com/help/mcve – bosnjak

+0

不幸的是,這是問題的一部分,我目前無法找到一個,至少在沒有提交或多或少整個應用程序。我們看起來隨機出現了崩潰,而且我們還沒有能夠追蹤到導致它崩潰的原因。它在不同的時間崩潰,並在不同的電話。我們正試圖找到一個最低限度的可驗證版本,如果我們這樣做,我們也可能解決了這個問題,但現在,我們還沒有能夠...... – Patrik

+0

所以,基本上,我們並不想要精確地回答了錯誤,因爲沒有代碼示例,這顯然是不可能的。我們只是想聽聽是否有人知道發生這種情況的任何條件/錯誤/錯誤。我們已經聽說從另一個線程進行回調可能會發生這種情況(我們不這樣做),因此,是否有人遇到其他導致此問題的情況。 – Patrik

回答

0

如果JavaScript在Objective-C中設置回調以偵聽消息,則可能發生這種情況。確保ObjC在它設置的相同線程上調用Javascript回調。

也發佈一些代碼,以便我們可以驗證這一點。

+0

嗯,我在原來的職位曾經說過:「我們已確保所有調用到JavaScript的背景下正在從同一個線程做,因爲我們在其他地方看,從另一個線程比回調原先調用一個可能給這個錯誤,但這沒有幫助。「這包括回調,如果不清楚,則很抱歉。每個呼叫從ObjC爲Javascript,包括運行的回調,從我們的JavaScript線程的工作完成。 – Patrik

0

我遇到過類似的問題。

我的解決方案是確保創建上下文的線程不會死亡。它似乎不需要做任何事情,但我懷疑試圖獲取線程狀態的錯誤與線程沒有死亡有關。

如果有人對我如何找到這種潛在關係感到好奇,我重構了代碼以使回調運行在創建解釋器的同一線程中 - 社區的寶貝解決方案 - 並退出了部分代碼在我將其縮小到這個範圍之前,可以通過各種方式重新創建問題。

如果你需要保持一個線程活着來測試你的情況,一個簡單的方法是用dispatch_semaphore_wait對一個永遠不會被髮信號的信號量(比如你在調用dispatch_semaphore_wait之前創建的信號量)。