调试Big Sur中的JavaScriptCore堆崩溃



我在我的应用程序中有一个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中重新创建类似的方案不会就我所知,会导致崩溃。大苏尔之前的系统似乎没有受到影响。

最新更新