将 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 上进行测试),事实上它没有解决问题,也没有解释缺少数据背后的原因, 它只是将问题隐藏起来。
我认为有两点值得指出。
- 唯一实际被重定向的输出是 Chrome 相关的。我的意思是,如果我们将 stderr 重定向到一个文件,我们可以看到这个文件中的错误,但只有 Chrome 的错误,而不是 V8 的错误。
- 我想使用
script
命令,因为我尝试了 Powershell Start-Transcript
、Tee
和其他一些选项。事实证明(这里没有惊喜) Windows 没有可用于达到预期效果的命令(AFAIK)。所以我使用了 Babun (http://babun.github.io/),它基本上是预配置的 Cygwin。没有显示 GC 日志。只有 Chrome 的相关内容。我认为 V8 的日志没有被转发到 Cygwin。
更新:
这个问题可能与这些有关:
- Chrome 产生许多进程,从我从日志中看到的情况 - GC 日志是从子进程收集的(与打开的终端 window 相关的 PID 不同)。我不知道仅此一项会如何影响 STDOUT 重定向。这只是我注意到的一个事实。
- 我发现应用程序可能知道它的 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 一样多的数据
我们正在开发一个用于内存性能监控的自动化系统。
我们在 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 上进行测试),事实上它没有解决问题,也没有解释缺少数据背后的原因, 它只是将问题隐藏起来。
我认为有两点值得指出。
- 唯一实际被重定向的输出是 Chrome 相关的。我的意思是,如果我们将 stderr 重定向到一个文件,我们可以看到这个文件中的错误,但只有 Chrome 的错误,而不是 V8 的错误。
- 我想使用
script
命令,因为我尝试了 PowershellStart-Transcript
、Tee
和其他一些选项。事实证明(这里没有惊喜) Windows 没有可用于达到预期效果的命令(AFAIK)。所以我使用了 Babun (http://babun.github.io/),它基本上是预配置的 Cygwin。没有显示 GC 日志。只有 Chrome 的相关内容。我认为 V8 的日志没有被转发到 Cygwin。
更新:
这个问题可能与这些有关:
- Chrome 产生许多进程,从我从日志中看到的情况 - GC 日志是从子进程收集的(与打开的终端 window 相关的 PID 不同)。我不知道仅此一项会如何影响 STDOUT 重定向。这只是我注意到的一个事实。
- 我发现应用程序可能知道它的 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 一样多的数据