在 nodejs 上分析 JavaScript 代码 - 可能的方法

Posted

技术标签:

【中文标题】在 nodejs 上分析 JavaScript 代码 - 可能的方法【英文标题】:Profiling JavaScript Code on nodejs - Possible Approaches 【发布时间】:2014-02-05 07:30:28 【问题描述】:

我的目标是为 nodejs 开发一个 java 脚本分析器。 要求如下:

    应该能够获取调用堆栈。 获取时间戳信息。 获取迭代次数。

我主要担心的是我不应该修改源文件(.js 文件)。

我已经在 node js 上看到了所有可用的 javascript 代码分析选项。我面临的问题是,它们中的大多数都需要将分析特定代码手动注入到我的源代码中。这是一个例子

var profiler = new Profiler() //需要在我的.js文件中创建profiler

profiler.startProfiling()

//我的代码

profiler.endProfling()

因为大多数分析器都需要这种代码注入。 任何人都可以建议我任何其他分析替代方案(不需要修改源代码)。

目前我正在使用 node js 提供的 v8 功能来分析我的 JavaScript 代码。例如

node --prof MyTestApp.js

这个命令给了我一个 v8.log 。这是sample log

这是我的疑问

    v8 是否有可能的解决方法,以便我可以添加时间戳信息,函数的迭代计数 是否有任何其他分析工具(v8 除外)可以满足我的要求。

感谢帮助

【问题讨论】:

【参考方案1】:

您可以使用英特尔 VTune Amplifier XE 来分析 JS 代码。简而言之,您将能够看到您的 JS 函数收集的样本以及这些样本如何通过 JS 源文件分发。此外,VTune 显示完整的调用堆栈信息,包括 java (JIT) 帧和本机帧(本机代码,例如,系统库或从 JS 代码调用的本机库)。 无需在代码中注入任何内容,但您应该重新构建 Node.js(不到 5 分钟)。

如何在 Node.js 中启用 VTune 支持

    下载 node.js sources(每晚构建)。 请注意,最后一个版本是 v0.10.25,但它包含不支持 VTune 的 v8。 v0.11.11 升级到 v8 v.3.22.24.19,支持 VTune。

    只需添加 3 行即可启用 VTune 支持

    在 \src\node.cc 中添加 2 行

      #include "v8-vtune.h" // located in \deps\v8\src\third_party\vtune
    
    

    void Init(...) … V8::SetFlagsFromCommandLine(&v8_argc, const_cast(v8_argv), true); vTune::InitializeVtuneForV8();

    在 \node.gyp 文件中添加 1 行 以添加和构建 VTune 支持

      'target_name': 'node',
      'type': 'executable',
      'dependencies': [
        'node_js2c#host',
        'deps/v8/src/third_party/vtune/v8vtune.gyp:v8_vtune',
      ], 
    运行位于根 node-v0.11.11 文件夹中的“vcbuild.bat nosign”

现在您已准备好使用 VTune 分析在 Node.js 中运行的 JS 代码

如何使用 VTune 分析 Node.js

VTune 可以在here 下载。先试用评估版。

我的小应用 - test.js

<pre> <code> function say(word) 
console.log("Calculating ...");
var res = 0;
for (var i = 0; i < 20000; i++) 
  for (var j = 0; j < 20000; j++) 
    res = i * j / 2;
  
 
console.log("Done.");
console.log(word);


function execute(someFunction, value) 
  someFunction(value);


execute(say, "Hello from Node.js!");  </code> </pre>
    打开 VTune (bin32\amplxe-gui.exe) 创建一个新项目 将“node.exe”指定为要运行的应用程序,将“test.js”指定为应用程序的参数 点击确定,然后点击新建分析 选择“高级热点”作为分析类型并选中“热点、堆栈和上下文切换”以指定在分析会话期间收集的信息级别。开始分析。 当收集停止时,VTune 将显示样本如何通过 JS 函数分布。您可以深入了解函数,以查看示例如何通过某个 JS 函数的源代码行分布。

【讨论】:

以上是关于在 nodejs 上分析 JavaScript 代码 - 可能的方法的主要内容,如果未能解决你的问题,请参考以下文章

javascript NodeJ在Windows上处理Ctrl + C.

在 Azure 上使用 Apple Pay JavaScript/NodeJS

JS内存垃圾回收

使用 NodeJs Express 在 JavaScript 上推送通知

在nodejs中事件循环分析

使用从客户端收到的谷歌授权码在服务器端 javascript (nodejs) 上获取访问令牌