使用 vtune 和 jitprofiling.h 支持编译 nodejs

Posted

技术标签:

【中文标题】使用 vtune 和 jitprofiling.h 支持编译 nodejs【英文标题】:Compiling nodejs with vtune and jitprofiling.h support 【发布时间】:2014-10-24 16:09:42 【问题描述】:

我唯一的目的是在 Node.js 下使用 vTune 分析 javascript 代码。

我尝试按照此帖子下方显示的步骤操作:Profiling Nodejs with vTune,但我没有运气。

我使用的是 Debian 7 x86_64,我的 vTune Amplifier XE 版本是 2015(评估模式)。这些模块在启动时用service sep3_15 start 加载,我可以用lsmod 看到它们。另外,我构建了 vTune 提供的示例jitprofiling 项目,它可以工作(我可以看到动态内容)。所以,我的问题是构建带有 vTune 支持的 Node.js。

如果我执行上述步骤,我只是将vcbuild.bat nosign 更改为./configuremake,我会收到一个错误“../src/node.cc:22:67: fatal error: v8-vtune .h:没有这样的文件或目录”,并且继续正确编译的唯一解决方案是在node.gyp中添加下一行:

  'include_dirs': [
    // ...
    'deps/v8/src/third_party/vtune',
    // ...

这是获取包含 (v8-vtune.h) 和编译节点的唯一方法。

但是使用 vTune Amplifier 导入时,我看不到 Dynamic code 也看不到 JS 的来源。

我尝试了许多不同的方法,例如使用./configure --build 甚至./configure --debug --gdb 构建用于调试的节点,然后强制从out/Debug/node 执行node 二进制文件,而不是从out/Release/node。我可以看到它具有符号定义(strings node | wc -l 比发布版本大得多),因为它在使用 vTune 进行分析时不会引发警告。虽然我可以看到所有节点源代码,但我看不到Dynamic code

我什至试图在deps/v8/Makefile下强制变量gdbjit=onvtunejit=on

我尝试使用每晚构建 0.11.11 和最新的 0.11.14。

我不知道该怎么办。

编辑:我正在使用不同的选项(如上所述)进行更多编译。最后,我可以看到它在 0.11.12 版本之前是如何工作的,但不是 0.11.13 也不是 0.11.14。

【问题讨论】:

【参考方案1】:

由于 V8 中的更改,node.js 0.11.13 所针对的 V8 中的 VTune 支持被破坏。它已在最新的 V8 版本中得到解决。 对于 node.js 0.11.13,您需要手动修复它:

    遵循此说明Profiling Nodejs with vTune。我假设您已经完成了。 修复损坏的 VTune 支持:

[nodejs-v0.11.13]\deps\v8\include\v8.h 文件: 替换

Handle<Script> script;

Handle<UnboundScript> script;

[nodejs-v0.11.13]\deps\v8\src\log.cc 文件:在“void JitLogger::LogRecordedBuffer(...)”函数中,替换

event.script = ToApiHandle<v8::UScript>(script_handle);

event.script = ToApiHandle<v8::UnboundScript>(script_handle);

[nodejs-v0.11.13]\deps\v8\src\third_party\vtune\vtune-jit.cc 文件:在“void VTUNEJITInterface::event_handler(const v8::JitCodeEvent* event)”函数中,替换

Handle<Script> script = event->script;

Handle<UnboundScript> script = event->script;

应该有帮助。

【讨论】:

以上是关于使用 vtune 和 jitprofiling.h 支持编译 nodejs的主要内容,如果未能解决你的问题,请参考以下文章

基于挂钟时间和英特尔 Vtune 放大器的 Profile C++ 程序

vtune 与 mingw

哪个是使用 VTUNE 进行分析的更好方法:独立或与 MSVC 集成

VTune:使用 3 个以上端口的高价值是好是坏

为啥我们在使用 Vtune 进行分析时需要调试信息?

使用 VS2012/VTune 进行缓存分析