【问题标题】:Safari plugin crashes on NPN_GetValueSafari 插件在 NPN_GetValue 上崩溃
【发布时间】:2012-05-04 10:07:44
【问题描述】:

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

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;
}

我提供给浏览器的插件函数中调用了createMainNPObject。

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;

通过调试代码,发现系统在调用浏览器->getValue时抛出了EXC_BAD_ACCESS,看起来npp指针无效。

0x00007fff83f82dab  <+0019>  je     0x7fff83f82db9 <_ZN6WebKit14NetscapePlugin7fromNPPEP4_NPP+33>
0x00007fff83f82dad  <+0021>  incl   0x8(%rax)

谁能帮帮我?

谢谢!

【问题讨论】:

  • 你的分配函数是什么样的?
  • 我将分配功能添加到原始帖子中。非常感谢!

标签: macos safari npapi


【解决方案1】:

嗯;没有看到任何明显的东西。尝试向您的结构添加另一个参数(一个 int?)并在分配期间或紧随其后设置它,然后稍后检查它是否仍然是您在调用 getvalue 之前设置的值。查看您的结构是否以某种方式损坏。当我以一种不明显的方式使 NPObject 变得有趣时,这种情况发生在我身上。

【讨论】:

  • 我在 MainNPObject 中添加了一个 int 成员,并在 allocate 中将值设置为 25。当我签入调用方法时,该值已正确传入。我还创建了一个静态 MainNPObject 来记录对象。与从浏览器传入的相比,它们是相同的。插件总是在 WebKit::NetscapePlugin::fromNPP 处崩溃。现在我完全迷失了。我已将项目上传到 Dropbox,请问您可以再看一下吗? dropbox.com/s/fvv74iu98a2c16f/…
  • 终于找到了根本原因。我错误地将 MainNPObject 结构中的 NPObject 成员声明为指针!当浏览器调用invoke方法时,由于这个原因,npp成员指向其他地方。出租车司机,我将您的评论标记为答案,因为它为我提供了正确的调查方向。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 2018-09-18
  • 2012-12-22
  • 1970-01-01
  • 2014-10-01
  • 2012-08-04
相关资源
最近更新 更多