跟踪 Node.js 程序的执行

3
我希望追踪任意Node.js程序的执行路径。
具体来说,我想运行一个程序(服务器或脚本),并且要有某种块级别(函数调用,循环,if语句)的执行跟踪。
限制条件:
- 输出必须包含所有执行期间的文件/行号/命中计数。 - 不采用代码缩小。 Istanbul很棒,但我希望最终执行的代码尽可能可读性强。 - 对于长时间运行的进程(例如服务器),我希望能够看到“当前”行覆盖率(或者尽可能新的覆盖率)。 - 我不想失去任何覆盖数据,因此虽然分析会给我一些线索,但它实际上并不是代码覆盖率。
我不关心以下内容:
- 覆盖范例的读取方式。例如,它可以输出到文件中,可以通过代码读取等等。 - 覆盖格式
我已经研究过的事情:
使用NODE_V8_COVERAGE:
我发现如果将NODE_V8_COVERAGE环境变量设置为一个目录,程序退出时覆盖率数据将输出到该目录(这里有一个关于此功能创建的博客文章)。
我在这里面临的问题是,我不确定是否有一种方法可以在程序终止之前触发生成这些报告。
使用检查器
我还尝试过使用Node.js检查器。我找到了一个有用的CPU分析器这里。这可能会很有帮助,但这个分析器是通过采样而不是作为语言钩子来工作的。因此,我只能得到代码中慢的部分的行号/计数。
我还尝试使用Profiler.startPreciseCoverage,以为这样可以给我执行的每一行代码(并没有发现文档对此做出清晰的说明)。但它似乎没有更有用。
使用伊斯坦布尔
我希望尽可能避免对代码进行仪器化。
问题
看起来我的选择很有限,但同时这只是我搜索了一两个小时的结果。
是否有更好的方法来满足上述约束条件下的行覆盖?

我不确定是否完全理解您的要求,但您是否尝试使用ndb(https://github.com/GoogleChromeLabs/ndb)运行脚本/服务器? 您可以添加断点以在特定点停止执行并检查范围。但对您更重要的是:您可以记录性能并获得某种FlameGraph。您还可以使用它来分析内存使用情况。 这是针对Node.js的Chrome DevTools。 - boehm_s
精确覆盖率(startPreciseCoverage)和尽力覆盖率之间的区别在 https://v8.dev/blog/javascript-code-coverage 上有详细介绍。如果我理解正确,精确覆盖率会记录超出作用域的函数计数,而尽力覆盖率则会丢失该信息。 - Trott
如果你需要在应用程序中添加一行代码以导出当前覆盖率,这是否能够满足你的需求? - Trott
@Trott 那就可以了!添加几行代码不是什么大问题。 - wheresmycookie
1个回答

0

Node.js有一个拉取请求等待中,用于添加编程启动/停止/写入V8覆盖信息的功能。如果您想冒险,可以使用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

更长远地说,您可以参与到拉请求中,评论它是否符合您的需求,并希望再次启动。它似乎已经停滞不前了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接