【问题标题】:Tracing Node.js program execution跟踪 Node.js 程序执行
【发布时间】:2020-12-14 19:12:58
【问题描述】:

我想跟踪任意 Node.js 程序的执行路径。

具体来说,我想运行一个程序(服务器或脚本),并对执行进行某种块级(函数调用、循环、if 语句)跟踪。

约束

  • 输出必须包含执行期间所有行的文件/行/命中计数
  • 没有代码缩小。伊斯坦布尔很棒,但我想让最终执行的代码尽可能地可读。
  • 对于长时间运行的进程(例如服务器),我希望能够查看“当前”行覆盖率(或尽可能最新)
  • 我不想丢失任何覆盖率数据,因此虽然 Profiling 会给我一些关于行命中的提示,但这并不是真正的代码覆盖率。

我不关心的事情

  • 究竟是如何读取覆盖范围的。例如,可以输出到文件,可以通过代码读取等。
  • 覆盖格式

到目前为止我调查过的事情:

使用 NODE_V8_COVERAGE:

我发现如果我将NODE_V8_COVERAGE环境变量设置为一个目录,程序退出时覆盖率数据会输出到那个目录(这里有一个blog post关于这个特性的创建)。

我在这里面临的问题是,我不确定是否有办法在程序终止之前触发这些报告的生成。

使用检查器

我也一直在尝试使用 Node.js 检查器。我找到了一个有用的 CPU 分析器 here。这最终可能会有所帮助,但此分析器通过采样工作,而不是作为语言的挂钩。结果,我只获得了部分代码缓慢的行号/计数。

我也尝试使用Profiler.startPreciseCoverage,认为这可能会以某种方式给我执行的每一行(没有找到文档来明确它的实际作用)。好像没什么用了

使用伊斯坦布尔

如果可能,我想避免检测代码。

问题

我的选择似乎有限,但同时这只是我谷歌搜索一两个小时的结果。

有没有更好的方法来捕获上面列出的约束条件下的线路覆盖范围?

【问题讨论】:

  • 我不确定是否完全理解您的要求,但您是否尝试过使用 ndb (github.com/GoogleChromeLabs/ndb) 运行您的脚本/服务器?您可以添加断点以在特定点停止执行并检查范围。但对你来说更重要的是:你可以记录性能,它会给你某种 FlameGraph。您还可以使用它来分析内存使用情况。它是 chrome devtools,但适用于 nodejs
  • 精确覆盖 (startPreciseCoverage) 和尽力覆盖之间的区别在 v8.dev/blog/javascript-code-coverage 中进行了介绍。 IIUC,精确覆盖对超出范围的功能进行计数,而尽力而为的覆盖会丢失该信息。
  • 如果你必须在你的应用中添加一行代码来写出当前的覆盖率,那会满足你的需求吗?
  • @Trott 没关系!添加几行并不破坏交易

标签: node.js code-coverage


【解决方案1】:

a pull request pending for Node.js to add functionality to programmatically start/stop/write V8 coverage information。如果您喜欢冒险,可以使用 git 获取您想要使用的 Node.js 版本,应用补丁中的提交,然后编译 Node.js 二进制文件。

如果您克隆 Node.js 存储库,则会标记各种版本的 Node.js。因此,您可以通过查看 v12.19.0 标记来获取 Node.js 12.19.0 的代码。

您可以正常从拉取请求中挑选提交,或者您可以使用curl -L https://github.com/nodejs/node/pull/33807.patch | git am 将提交应用为补丁。

编译/构建 Node.js 二进制文件的说明可以在 https://github.com/nodejs/node/blob/master/BUILDING.md#building-nodejs-on-supported-platforms 找到。

从长远来看,您可以在拉取请求中加入它是否满足您的需求,并希望它再次运行。好像停了。

【讨论】:

    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多