我们正在开发一个用于内存性能监控的自动化系统。
我们在 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 相关的数据,尽管终端窗口中的数据很丰富(您可以在运行应用程序根本没有流捕获)。
我们假设 V8 的一个新进程正在运行,并且它的输出不会定向到 stdout,尽管它会在某种程度上打印到控制台本身。
V8 C++ 代码没有显示出这种奇怪的重定向的标记,相当干净的标准代码,事实上,我们可以毫无问题地记录 node --trace-gc script.js
的 gc 输出标准输出/标准错误。 Chrome 似乎添加了不良行为。
问题如何在 Windows 和 MacOS X 上将 Chrome GC 相关数据记录到文件中。
部分、 Not Acceptable 解决方案在基于 POSIX 的系统上,我们可以使用 script
命令获取所有终端输出。转储包含我们需要的所有数据,但该解决方案不涵盖 Windows 场景(我们确实需要在 Windows 上进行测试),事实上它并没有解决问题,也没有解释缺少数据背后的原因,它只是隐藏了问题。
最佳答案
我认为有两件事值得指出。
- 实际重定向的唯一输出与 Chrome 相关。我的意思是,如果我们将 stderr 重定向到一个文件,我们可以看到该文件中的错误,但只有 Chrome 的错误,而不是 V8 的错误。
- 我想使用
script
命令,因为我尝试了 PowershellStart-Transcript
、Tee
和其他一些选项。事实证明(这并不奇怪)Windows 没有可用于达到所需效果的命令(AFAIK)。所以我使用了 Babun ( http://babun.github.io/ ),它基本上是预先配置的 Cygwin。没有显示 GC 日志。只有 Chrome 的相关内容。我认为 V8 的日志没有被转发到 Cygwin。
更新:
此问题可能与以下内容有关:
- Chrome 产生了许多进程,从日志中可以看到 - GC 日志是从子进程收集的(与打开的终端窗口相关的 PID 不同)。我不知道这会如何影响 STDOUT 重定向。这只是我注意到的一个事实。
- 我发现应用程序可能知道其 STOUD 是否被重定向,并以不同的方式处理这种情况 - 例如。我。当 STDOUT 重定向到文件时使用缓冲区而不刷新,但如果它打印在控制台上则不会。
更新:
我创建了以下错误:https://bugs.chromium.org/p/chromium/issues/detail?id=865876#c3
看来有人注意到了,有人会来处理它。
更新:
看来 ChromeDriver 可以完全满足我们的需要 - http://chromedriver.chromium.org/logging/performance-log
另一种解决方法是使用 --enable-precise-memory-info
运行 Chrome 并定期调用 window.performance.memory
,但该命令并没有为我们提供几乎与 ChromeDriver 一样多的数据
关于google-chrome - 将 Chrome/V8 --trace-gc 输出写入文件 - stdout 重定向不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51382711/