npapi插件与firefox 4.0及更高版本有问题

时间:2011-08-22 06:45:00

标签: firefox npapi npruntime

我为firefox / chrome开发了基于npruntime的插件,并且它与ff3.6 / chrome 10配合工作正常,但是当我在加载我的插件后在firefox 4.0或更高版本中加载任何其他插件时,则firefox挂起 即如果我在加载插件后打开gmail,则firefox停止响应,我已经确认它与插件容器有关。 任何人都可以建议我哪里错了?任何指针将不胜感激。 提前致谢

这是ff6的调用堆栈

  

ntdll.dll!_ZwWaitForSingleObject@12()
  ntdll.dll!_ZwWaitForSingleObject@12()
  kernel32.dll!_WaitForSingleObjectExImplementation@12()   kernel32.dll!_WaitForSingleObject@8()
  nspr4.dll!_PR_MD_WAIT_CV(_MDCVar * cv,_MDLock * lock,unsigned int timeout)
  nspr4.dll!_PR_WaitCondVar(PRThread * thread,PRCondVar * cvar,PRLock * lock,unsigned int timeout)
  nspr4.dll!PR_WaitCondVar(PRCondVar * cvar,unsigned int timeout)
  xul.dll!mozilla :: CondVar :: Wait(unsigned int interval)
  xul.dll!mozilla :: ipc :: GeckoChildProcessHost :: SyncLaunch(std :: vector,std :: allocator>,std :: allocator,std :: allocator>>> aExtraOpts,int aTimeoutMs,base :: ProcessArchitecture arch)   xul.dll!mozilla :: plugins :: PluginProcessParent :: Launch(int timeoutMs)
  xul.dll!mozilla :: plugins :: PluginModuleParent :: LoadModule(const char * aFilePath)
  xul.dll!GetNewPluginLibrary(nsPluginTag * aPluginTag)   xul.dll!nsNPAPIPlugin :: CreatePlugin(nsPluginTag * aPluginTag,nsNPAPIPlugin * * aResult)
  xul.dll!CreateNPAPIPlugin(nsPluginTag * aPluginTag,nsNPAPIPlugin * * aOutNPAPIPlugin)
  xul.dll!nsPluginHost :: EnsurePluginLoaded(nsPluginTag * plugin)
  xul.dll!nsPluginHost :: GetPlugin(const char * aMimeType,nsNPAPIPlugin * * aPlugin)
  xul.dll!nsPluginHost :: TrySetUpPluginInstance(const char * aMimeType,nsIURI * aURL,nsIPluginInstanceOwner * aOwner)   xul.dll!nsPluginHost :: SetUpPluginInstance(const char * aMimeType,nsIURI * aURL,nsIPluginInstanceOwner * aOwner)
  xul.dll!nsPluginHost :: InstantiateEmbeddedPlugin(const char * aMimeType,nsIURI * aURL,nsIPluginInstanceOwner * aOwner,int aAllowOpeningStreams)   ...

2 个答案:

答案 0 :(得分:1)

我会先尝试关闭IPC模式;你的堆栈似乎表明它在等待插件进程启动时挂起,但我不知道为什么它会挂起,因为它应该有一个超时。如果关闭IPC模式有帮助,那么问题很可能是在浏览器和插件主机进程之间干扰IPC。

接下来,我尝试将断点添加到DLL中的所有入口点。您可以通过在DllMain中放入sleep(10000)或类似内容来连接调试器;当插件开始加载时,它应该在执行任何潜在的破坏之前首先点击,然后你可以使用调试器连接到插件主机进程,然后检查你做了什么入口点,等等。进入足够长的时间最终会产生一些线索关于可能发生的事情。

你也可以尝试将它移植到类似FireBreath的东西,这已知是有用的,并且消除了你必须犯一个模糊错误的大部分机会,这可能是某些浏览器不喜欢的。

答案 1 :(得分:0)

我为每个浏览器开发了npruntime。 它在每个浏览器中运行良好,但是firefox仅在Windows 7中冻结。

我解决了将firefox配置“dom.ipc.plugins.enabled”编辑为false的问题。 我不知道它会起作用,但值得尝试。