Macos Safari插件在NPN_GetValue上崩溃

Macos Safari插件在NPN_GetValue上崩溃,macos,safari,npapi,Macos,Safari,Npapi,我的插件代码在调用NPN_GetValue时崩溃。基本上,我创建了一个可编写脚本的对象,它有一个“getDevice”方法,可以将设备数组返回到JavaScript。下面是代码片段 static bool mainNPObjectInvoke(NPObject *obj, NPIdentifier identifier, const NPVariant *args, uint32_t argCount, NPVariant *result) { printf("create main o

我的插件代码在调用NPN_GetValue时崩溃。基本上,我创建了一个可编写脚本的对象,它有一个“getDevice”方法,可以将设备数组返回到JavaScript。下面是代码片段

static bool mainNPObjectInvoke(NPObject *obj, NPIdentifier identifier, const NPVariant *args, uint32_t argCount, NPVariant *result)
{
    printf("create main object");
    MainNPObject *mainObject = (MainNPObject *)obj;

    if (identifier == methodIdentifiers[METHOD_ID_GET_DEVICES])
    {
        NPObject *windowObj = NULL;
        browser->getvalue(mainObject->npp, NPNVWindowNPObject, &windowObj);
        // it crashed here
    ....
    }
}
我用下面的方法创建了MainNPObject实例

NPObject *createMainNPObject(NPP npp)
{
    MainNPObject *object = (MainNPObject *)browser->createobject(npp, &mainNPClass);
    object->npp = npp;

    theMainObject = object;

    return (NPObject *)object;
}
CreateMainpObject在我提供给浏览器的插件函数中被调用

NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value)
{
    PluginObject *obj = instance->pdata;

    switch (variable) {
        case NPPVpluginCoreAnimationLayer:
            if (!obj->rootLayer)
                setupLayerHierarchy(obj);

            *(CALayer **)value = obj->rootLayer;

            return NPERR_NO_ERROR;

        case NPPVpluginScriptableNPObject:

            if (!obj->mainObject)
            {
                obj->mainObject = createMainNPObject(instance);
            }
 ....
}
分配功能如下所示

static NPObject *mainNPObjectAllocate(NPP npp, NPClass *class)
{
    initializeIdentifiers();

    MainNPObject *mainObject = malloc(sizeof(MainNPObject));
    mainObject->deviceManager = [[DeviceManager alloc] init];

    return (NPObject *)mainObject;
}
MainNPObject的定义:

typedef struct
{
    NPObject *npobject;
    NPP npp;
    DeviceManager *deviceManager;
} MainNPObject;
通过调试代码,我发现系统在调用browser->getValue时引发了EXC_BAD_访问,并且看起来npp指针无效

0x00007fff83f82dab  <+0019>  je     0x7fff83f82db9 <_ZN6WebKit14NetscapePlugin7fromNPPEP4_NPP+33>
0x00007fff83f82dad  <+0021>  incl   0x8(%rax)
有人能帮我吗


谢谢

Hmm;没有看到任何明显的东西。是否尝试将另一个参数添加为int?在分配期间或之后立即设置它,然后稍后检查它是否仍然是在调用getvalue之前设置的值。查看您的结构是否已损坏。有一次,当我以一种不明显的方式抛出NPObject时,我遇到了这种情况。

你的分配函数是什么样子的?我在原来的帖子中添加了我的分配函数。谢谢!我向MainNPObject添加了一个int成员,并在allocate中将该值设置为25。当我签入invoke方法时,正确地传入了该值。我还创建了一个静态MainNPObject来记录该对象。将其与从浏览器传入的进行比较,它们是相同的。插件总是在WebKit::NetscapePlugin::fromNPP点崩溃。现在我完全迷路了。我已经上传到dropbox的项目,我可以请你有进一步的了解吗?最后我找到了根本原因。我错误地将MainNPObject结构中的NPObject成员声明为指针!当浏览器调用invoke方法时,npp成员会因此指向其他地方。taxilian,我把你的评论标记为答案,因为它给了我正确的调查方向。谢谢