【问题标题】:JavaScriptCore on iOS: JavaScript garbage collection failediOS 上的 JavaScriptCore:JavaScript 垃圾回收失败
【发布时间】:2014-03-28 15:14:32
【问题描述】:

我们使用JavaScriptCore 在即将推出的应用程序中运行大部分业务逻辑。应用程序有时会崩溃,并出现以下错误:

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,所以它肯定不会在 Rosetta 中运行,并且会在模拟器和实际 iPhone 上发生。

这似乎主要发生在使用URLSession 上传图像时。我们已经确保所有对 javascript 上下文的调用都是从同一个线程进行的,因为我们在其他地方读到,来自另一个线程的回调可能会给出这个错误,但这并没有帮助。 (而且,根据JavaScriptCore 文档,JavaScriptCore 无论如何都应该是完全线程安全的)

那么,有人有什么想法吗?

【问题讨论】:

  • 你应该包含一个stackoverflow.com/help/mcve
  • 不幸的是,这是问题的一部分,我目前找不到,至少在不提交或多或少的整个申请的情况下找不到。我们似乎随机发生了崩溃,我们无法追踪导致它崩溃的原因。它在不同的时间和不同的电话上崩溃。我们正在尝试找到一个可验证的最小版本,如果我们这样做了,我们可能也已经解决了这个问题,但目前我们还无法...
  • 所以,基本上,我们不希望得到错误的准确答案,因为如果没有代码示例,这显然是不可能的。我们只是想知道是否有人知道导致这种情况发生的任何条件/错误/错误。我们已经听说从另一个线程进行回调会导致这种情况发生(我们没有),所以,有没有人遇到过导致这种情况的其他情况。

标签: ios garbage-collection javascriptcore


【解决方案1】:

如果 JavaScript 在 Objective-C 中设置回调来监听消息,就会发生这种情况。确保 ObjC 在其设置的同一线程上调用 Javascript 回调。

还发布一些代码,以便我们可以验证这一点。

【讨论】:

  • 好吧,正如我在原始帖子中所说:“我们确保所有对 javascript 上下文的调用都是从同一个线程进行的,因为我们在其他地方读到了来自另一个线程的回调,而不是最初调用一个可能会出现此错误,但这没有帮助。”这包括回调,如果不清楚,抱歉。从 ObjC 到 Javascript 的每个调用,包括运行回调,都是从我们的 javascript 工作线程完成的。
【解决方案2】:

我也遇到过类似的问题。

我的解决方案是确保创建上下文的线程不会死掉。它似乎不需要做任何事情,但我怀疑尝试获取线程状态的错误与线程没有死有关。

如果有人好奇我是如何找到这种潜在关系的,我会重构代码,让回调在创建解释器的同一个线程中运行——社区的宠儿解决方案——并以各种方式撤销部分代码重新创建问题的方法,直到我将其缩小到此为止。

如果您需要保持线程处于活动状态以针对您的情况进行测试,一种简单的方法是使用dispatch_semaphore_wait 处理永远不会发出信号的信号量(例如您在调用dispatch_semaphore_wait 之前创建的信号量)。

【讨论】:

    猜你喜欢
    • 2018-01-08
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 2011-12-21
    • 2012-01-28
    • 2013-06-27
    相关资源
    最近更新 更多