2014-03-28 50 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之前创建的信号量)。