0

像我之前的许多人一样,我在使用 Flash 降低整个 CPU 内核时遇到问题(具体来说,其中一个线程总是使用 100% 的 CPU)。

Flash 可能在超过 1 个页面上运行(我使用了很多选项卡),但似乎开始这种 CPU 使用的原因是在我开始流式传输电影之后。这在一段时间内运行良好,但在某些时候播放开始跳过,所以我决定进行调查。

我已经尝试使用 Xcode 的 Instruments.app 通过 CPU 采样进行调查,通过遍历采样的调用堆栈,我发现奇怪的是,大约 80% 的 CPU 使用率看起来很可疑,并且是由于恰好 4 次递归调用NP_Initialize(请参阅发生这种情况的 2 个呼叫站点之一的图片)。发生这种情况的两个站点(仅此而已?)都在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

4

1 回答 1

2

您所看到的是试图从剥离的二进制作品中符号化堆栈的方式的人工制品。

像大多数发布二进制文件一样,Flash 被剥离,这意味着您没有关于绝大多数二进制文件的任何符号信息。但是,必须导出 NP_Initialize 符号才能加载插件,因此它是二进制文件中为数不多的符号之一。调试器 UI 是为未剥离的二进制文件设计的,它的工作原理是从实际地址向后查看它可以找到的第一个函数名称。在许多情况下,在发布的 Flash 二进制文件中,无论地址是什么,它都是 NP_Initialize。

所以没有递归调用,当它说“NP_Initialize”时,你应该像阅读随机十六进制地址一样阅读它:“一些我不知道它是什么的函数”。

于 2013-02-24T19:37:17.563 回答