我们使用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
无论如何都应该是完全线程安全的)
那么,有人有任何想法吗?
答案 0 :(得分:0)
如果JavaScript在Objective-C中设置回调以侦听消息,则可能会发生这种情况。确保ObjC在它设置的同一个线程上调用Javascript回调。
同时发布一些代码,以便我们验证这一点。
答案 1 :(得分:0)
我遇到过类似的问题。
我的解决方案是确保创建上下文的线程不会死亡。它似乎不必做任何事情,但我怀疑试图获得线程状态的错误与线程没有死亡有关。
如果有人对我如何发现这种潜在关系感到好奇,我重构了代码,让回调在创建解释器的同一个线程中运行 - 社区的宠儿解决方案 - 并且支持部分代码以各种方式重新创建问题,直到我将其缩小到此为止。
如果您需要保持线程处于活动状态以便根据您的情况对其进行测试,一种简单的方法是dispatch_semaphore_wait
针对永远不会发出信号的信号量(例如您在调用dispatch_semaphore_wait
之前创建的信号量)。