使用 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
更改为./configure
和make
,我会收到一个错误“../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=on
和vtunejit=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++ 程序