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

时间:2018-07-17 13:31:32

标签: google-chrome garbage-collection chromium v8

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

我们在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相关的数据,但该文件中缺少所有与gc相关的数据(在运行日志文件时可以查看所有数据)。完全没有流捕获的应用)。

我们假设正在运行V8的新进程,并且其输出未定向到stdout,尽管有些输出会打印到控制台本身。

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

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

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

1 个答案:

答案 0 :(得分:1)

我认为有两点需要指出。

  1. 唯一实际重定向的输出是与Chrome相关的。我的意思是,如果我们将stderr重定向到一个文件,我们可以看到此文件中的错误,但是只有Chrome的错误而不是V8的错误。
  2. 在尝试Powershell scriptStart-Transcript和其他一些选项时,我想使用Tee命令。事实证明(在此没有惊奇)Windows没有可用于实现所需效果(AFAIK)的命令。因此我使用了Babun(http://babun.github.io/),它基本上是预先配置的Cygwin。没有显示GC日志。仅Chrome的相关资料。我认为V8的日志不会转发给Cygwin。

更新:
此问题可能与以下原因有关:

  1. Chrome产生了许多进程,从日志中可以看到-Chrome日志是从子进程中收集的(与打开的终端窗口相关的PID不同于其他进程的PID)。我不知道这如何影响STDOUT重定向。这只是我注意到的事实。
  2. 我发现一个应用程序可能知道其STOUD是否被重定向,并以不同的方式处理这种情况-e。一世。将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一样多的数据