将 Chrome/V8 --trace-gc 输出写入文件 - stdout 重定向不起作用

Writing Chrome/V8 --trace-gc output to a file - stdout redirection does not work

我们正在开发一个用于内存性能监控的自动化系统。

我们在 Windows7 和 MacOSX High Sierra 上都使用适当的标志 --trace-gc --trace-gc-verbose 启动 Chrome。

输出已打印并显示在控制台上。然而,使用标准流重定向捕获输出 不起作用:

我们做什么:

MacOS X: ./Google\ Chrome --js-flags="--trace-gc --trace-gc-verbose" > log.txt 2>&1

Windows: chrome --no-sandbox --js-flags="--trace_gc --trace_gc_verbose" > log.txt 2>&1

日志文件中写入的内容只是您在屏幕上看到的部分内容:尽管终端中有很多与 gc 相关的数据,但文件中缺少所有内容 window(您可以看到所有运行 应用程序完全没有流捕获时的数据)。

我们假设 V8 的一个新进程是 运行,它的输出没有定向到标准输出,尽管它在某种程度上被打印到控制台本身。

V8 C++ 代码没有显示这种奇怪的重定向标记,非常干净的标准代码,实际上可以记录 node --trace-gc script.js 的 gc 输出而标准 stdout/stderr 没有任何问题。似乎 Chrome 添加了不良行为。

问题 如何在 Windows 和 MacOS X 上将 Chrome gc 相关数据记录到文件中。

部分不可接受的解决方案 在基于 POSIX 的系统上我们可以使用 script 命令获取所有终端输出。转储包含我们需要的所有数据,但解决方案不涵盖 Windows 场景(我们确实需要在 Windows 上进行测试),事实上它没有解决问题,也没有解释缺少数据背后的原因, 它只是将问题隐藏起来。

我认为有两点值得指出。

  1. 唯一实际被重定向的输出是 Chrome 相关的。我的意思是,如果我们将 stderr 重定向到一个文件,我们可以看到这个文件中的错误,但只有 Chrome 的错误,而不是 V8 的错误。
  2. 我想使用 script 命令,因为我尝试了 Powershell Start-TranscriptTee 和其他一些选项。事实证明(这里没有惊喜) Windows 没有可用于达到预期效果的命令(AFAIK)。所以我使用了 Babun (http://babun.github.io/),它基本上是预配置的 Cygwin。没有显示 GC 日志。只有 Chrome 的相关内容。我认为 V8 的日志没有被转发到 Cygwin。

更新:
这个问题可能与这些有关:

  1. Chrome 产生许多进程,从我从日志中看到的情况 - GC 日志是从子进程收集的(与打开的终端 window 相关的 PID 不同)。我不知道仅此一项会如何影响 STDOUT 重定向。这只是我注意到的一个事实。
  2. 我发现应用程序可能知道它的 STOUD 是否被重定向并以不同方式处理这种情况 - 例如。一世。当 STDOUT 被重定向到一个文件时使用缓冲区而不刷新,但如果它被打印在控制台上则不会。

更新:
我创建了以下错误:https://bugs.chromium.org/p/chromium/issues/detail?id=865876#c3
好像有人注意到了,有人会处理的。

更新:
看起来 ChromeDriver 可以完全满足我们的需求 - http://chromedriver.chromium.org/logging/performance-log
另一种解决方法是 运行 Chrome 和 --enable-precise-memory-info 并定期调用 window.performance.memory,但该命令无法为我们提供与 ChromeDriver 一样多的数据