我在我的应用程序中有一个JavaScriptCore脚本接口,可以访问一些子类,可以在JSContext
中初始化。
在迁移到Big Sur之后,在上下文已经被放弃并且所有代码都被评估之后,我得到了不断的崩溃。崩溃是一般的保护错误(EXC_I386_GPFLT
)和更一般的坏访问错误(例如。Heap Helper Thread (30): EXC_BAD_ACCESS (code=1, address=0x7ffdde3bdf0
)。有些错误在非常低的地址,如0x18
。
解析器代码
self.vm = [[JSVirtualMachine alloc] init];
self.context = [[JSContext alloc] initWithVirtualMachine:_vm];
dispatch_async(dispatch_get_main_queue(), ^{
[self.context evaluateScript:script];
});
通过JavaScriptCore
使用自定义NSPanel
子类时会发生错误。
PluginWindow.h
仅包含相关代码:
-(instancetype)initWithHTML:(NSString*)html width:(CGFloat)width height:(CGFloat)height delegate:(id)delegate {
self = [super initWithContentRect:frame styleMask:NSWindowStyleMaskClosable | NSWindowStyleMaskUtilityWindow | NSWindowStyleMaskResizable | NSWindowStyleMaskTitled backing:NSBackingStoreBuffered defer:NO];
self.delegate = delegate;
return self;
}
子类可以通过JavaScript初始化:
let htmlWindow = App.htmlWindow()
一旦窗口关闭,主机(VM和上下文的所有者)应该被终止。可以一次完成此操作,但由于某种原因,初始化一个新类并取消旧类会导致崩溃。
是否有一种方法来创建某种保护针对JavaScriptCore不良访问错误,以及我如何有效地调试这些错误?
这可能与ARC和JavaScriptCore
之间的冲突有关。ARC已经处理了这个对象,而它的引用仍然存在于JSContext
中。
我运行了一些测试,有时bug可能在45分钟左右激活,应用程序完全空闲。我很确定,当JS垃圾收集激活时,它试图访问已经被ARC从内存中清除的东西。
我设法解决了这个问题,小心地不让任何东西为空,并保留对我通过JS初始化的所有东西的弱引用。
我不确定这是否是一个bug,并且在Swift中重新创建类似的方案不会就我所知,会导致崩溃。大苏尔之前的系统似乎没有受到影响。