跟踪 Node.js 程序执行
Tracing Node.js program execution
我想跟踪任意 Node.js 程序的执行路径。
具体来说,我想要 运行 一个程序(服务器或脚本),并具有某种块级(函数调用、循环、if 语句)执行跟踪。
约束
- 输出必须包含文件/行/执行期间所有行的命中计数
- 没有代码缩小。伊斯坦布尔很棒,但我想让最后执行的代码尽可能可读。
- 对于长运行宁进程(例如服务器),我希望能够看到“当前”线路覆盖(或尽可能最新)
- 我不想丢失任何覆盖率数据,因此虽然 Profiling 会给我一些关于命中行的提示,但这并不是真正的代码覆盖率。
我不关心的事情
- 报道的具体阅读方式。比如输出到文件,通过代码读取等等
- 报道格式
到目前为止我调查过的事情:
使用NODE_V8_COVERAGE:
我发现如果我将NODE_V8_COVERAGE
环境变量设置为一个目录,当程序退出时,覆盖率数据会输出到那个目录(这里有一个blog post关于这个特性的创建) .
我在这里面临的问题是,我不确定是否有办法在程序终止之前触发这些报告的生成。
使用检查器
我也一直在试验 Node.js inspector。我找到了一个有用的 CPU 分析器 here。这最终可能会有所帮助,但这个分析器是通过采样来工作的,而不是作为语言的钩子。结果,我只获得了部分运行缓慢的代码的行号/计数。
我也尝试过使用 Profiler.startPreciseCoverage
,认为这可能会以某种方式为我提供执行的每一行(没有找到明确说明其实际作用的文档)。好像没什么用
使用伊斯坦布尔
我想尽可能避免检测代码。
问题
看来我的选择有限,但同时这只是我谷歌了一两个小时的结果。
有没有更好的方法来捕获上面列出的约束的线覆盖?
有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 的代码。
您可以 cherry-pick 从拉取请求中正常提交,或者您可以使用 curl -L https://github.com/nodejs/node/pull/33807.patch | git am
将提交作为补丁应用。
compiling/building Node.js 二进制文件的说明可在 https://github.com/nodejs/node/blob/master/BUILDING.md#building-nodejs-on-supported-platforms.
中找到
从长远来看,您可以对拉取请求提出意见,看看它是否满足您的需求,并希望它能再次进行。好像停滞了。
我想跟踪任意 Node.js 程序的执行路径。
具体来说,我想要 运行 一个程序(服务器或脚本),并具有某种块级(函数调用、循环、if 语句)执行跟踪。
约束
- 输出必须包含文件/行/执行期间所有行的命中计数
- 没有代码缩小。伊斯坦布尔很棒,但我想让最后执行的代码尽可能可读。
- 对于长运行宁进程(例如服务器),我希望能够看到“当前”线路覆盖(或尽可能最新)
- 我不想丢失任何覆盖率数据,因此虽然 Profiling 会给我一些关于命中行的提示,但这并不是真正的代码覆盖率。
我不关心的事情
- 报道的具体阅读方式。比如输出到文件,通过代码读取等等
- 报道格式
到目前为止我调查过的事情:
使用NODE_V8_COVERAGE:
我发现如果我将NODE_V8_COVERAGE
环境变量设置为一个目录,当程序退出时,覆盖率数据会输出到那个目录(这里有一个blog post关于这个特性的创建) .
我在这里面临的问题是,我不确定是否有办法在程序终止之前触发这些报告的生成。
使用检查器
我也一直在试验 Node.js inspector。我找到了一个有用的 CPU 分析器 here。这最终可能会有所帮助,但这个分析器是通过采样来工作的,而不是作为语言的钩子。结果,我只获得了部分运行缓慢的代码的行号/计数。
我也尝试过使用 Profiler.startPreciseCoverage
,认为这可能会以某种方式为我提供执行的每一行(没有找到明确说明其实际作用的文档)。好像没什么用
使用伊斯坦布尔
我想尽可能避免检测代码。
问题
看来我的选择有限,但同时这只是我谷歌了一两个小时的结果。
有没有更好的方法来捕获上面列出的约束的线覆盖?
有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 的代码。
您可以 cherry-pick 从拉取请求中正常提交,或者您可以使用 curl -L https://github.com/nodejs/node/pull/33807.patch | git am
将提交作为补丁应用。
compiling/building Node.js 二进制文件的说明可在 https://github.com/nodejs/node/blob/master/BUILDING.md#building-nodejs-on-supported-platforms.
中找到从长远来看,您可以对拉取请求提出意见,看看它是否满足您的需求,并希望它能再次进行。好像停滞了。