弄清楚为啥 Flash(Firefox 插件)在递归 NP_Initialize 上使用 100% CPU
Posted
技术标签:
【中文标题】弄清楚为啥 Flash(Firefox 插件)在递归 NP_Initialize 上使用 100% CPU【英文标题】:Figuring out why Flash (Firefox plugin) uses 100% CPU on recursive NP_Initialize弄清楚为什么 Flash(Firefox 插件)在递归 NP_Initialize 上使用 100% CPU 【发布时间】:2013-02-24 18:02:56 【问题描述】:像我之前的许多人一样,我在使用 Flash 降低整个 CPU 内核时遇到问题(具体来说,其中一个线程总是占用 100% 的 CPU)。
Flash 可能在超过 1 个页面上运行(我使用了很多选项卡),但似乎是在我开始流式传输电影之后才开始使用这种 CPU。这在一段时间内运行良好,但在某些时候播放开始跳过,所以我决定进行调查。
我尝试过使用 Xcode 的 Instruments.app 对 CPU 采样进行调查,沿着采样的调用堆栈走下去我发现奇怪的是,大约 80% 的 CPU 使用率看起来很可疑,并且恰好是 4 次递归造成的呼叫NP_Initialize
(参见图片,了解发生这种情况的两个呼叫站点之一)。
发生这种情况的两个站点(仅此而已?)都在0x10fb8ec66 > 0x10fb93947
(在此示例中)的堆栈树中。我也附上了痕迹。
和
我认为这很不自然,特别是因为从我读到的关于 NPAPI 的内容中,NP_Initialize
意味着浏览器只能调用一次。所以有人愿意就为什么会发生这种情况提出建议吗?
我在 OSX Mountain Lion 10.8.2 上使用最新的 Firefox Beta 20.0,我的 Shockwave Flash 版本是 11.6.602.167。
仪器跟踪http://www.sendspace.com/file/h12wte
【问题讨论】:
【参考方案1】:您所看到的是试图从剥离的二进制作品中符号化堆栈的方式的人工制品。
与大多数发行版二进制文件一样,Flash 被剥离,这意味着您没有关于绝大多数二进制文件的任何符号信息。但是,必须导出 NP_Initialize 符号才能加载插件,因此它是二进制文件中为数不多的符号之一。调试器 UI 是为未剥离的二进制文件设计的,它的工作原理是从实际地址向后查看它可以找到的第一个函数名称。在许多情况下,在发布的 Flash 二进制文件中,无论地址是什么,它都是 NP_Initialize。
所以没有递归调用,当它显示“NP_Initialize”时,您应该像阅读随机十六进制地址一样阅读它:“一些我不知道它是什么的函数”。
【讨论】:
好点 - 没有太多调试剥离二进制文件的经验。那么有什么方法可以理解这个堆栈跟踪吗?例如,反汇编 flash 二进制文件并查找这些偏移量。另外,看看我提到的最重的堆栈跟踪,调用堆栈上方FlashPlayer-10.6
中的其他函数似乎有地址,而不是所有都被别名为NP_Initialize
,这将如何解释?
当然,您可以转储程序集并根据需要读取它,如果您有 Flash 插件的加载偏移量,则可以匹配地址。至于二进制中的非(严重)符号化地址,只需要它们在二进制中比存在的第一个符号更早。以上是关于弄清楚为啥 Flash(Firefox 插件)在递归 NP_Initialize 上使用 100% CPU的主要内容,如果未能解决你的问题,请参考以下文章